Ordinary hut

人间一福地,胜似天仙宫
posts - 61, comments - 50, trackbacks - 0, articles - 1

2010年2月19日

java中wait和notify的简单理解
1 它们都是Object的属性;
2 wait:释放对象锁;由于把锁释放了,当前线程就会卡住,继续再等待获取锁的机会(也许是干了一半的活后,就把活交出去了,然后等待继续干活的机会);
3 notify:告诉其中一个等待的线程(具体哪一个不知道),我已经用完这个对象,你可以继续用了
4 它们都要包含在synchronized块里,只有先锁住这个对象,才能进行wait、notify操作;

例子:
1 定义一个普通对象
public class MyObj {
    public String name;
}
2 主线程类,定义MyObj对象,new两个线程
public class TestMain {

    public static MyObj obj = new MyObj();
    
    /**
     * 
@param args
     
*/
    public static void main(String[] args) throws Throwable {
        new TestMain().myTest();
    }
    
    public void myTest() throws Throwable{
        Test1 test1 = new Test1();
        Test2 test2 = new Test2();
        
        Thread t1 = new Thread(test1); 
        Thread t2 = new Thread(test2); 
        
        t1.start();
        Thread.sleep(1000);//启动线程1,然后主线程睡眠1秒钟,再启动2
        t2.start();
        
    }

}
3 定义线程1,:
public class Test1 implements Runnable{

    @Override
    public void run() {
        synchronized (TestMain.obj) {//占有对象锁
            try {
                TestMain.obj.name="1";
                System.out.println(TestMain.obj.name); //打印出1
                TestMain.obj.wait();  //释放对TestMain.obj对象的锁,同时当前线程立即卡住,陷入等待
                System.out.println(TestMain.obj.name);//只有线程再次抢到TestMain.obj的锁后,才会运行
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}
4 线程2:
public class Test2 implements Runnable{

    @Override
    public void run() {
        
        synchronized (TestMain.obj) { //当线程1释放这个对象的锁时,本线程立即得到
            TestMain.obj.name = "2"; //改值
            TestMain.obj.notify();//通知占用了TestMain.obj且当前是等待的线程(线程1)可以继续,但是必须等到本synchronized块执行完毕。
            TestMain.obj.name = "3";
            TestMain.obj.name = "4";
            
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            TestMain.obj.name = "7";//执行完毕,此时线程1被唤醒,会打印出7
        }
    }

}
结果显示1和7


posted @ 2013-04-27 15:23 landor 阅读(337) | 评论 (0)编辑 收藏

转载 http://supertoffy.blog.163.com/blog/static/16447681820116150115743/


每个地区都有自己的本地时间,在网上以及无线电通信中时间转换的问题就显得格外突出。我自己就经常混淆于此,特地研究了一下,记录在此以备忘。
整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。在本文中,UTC与GMT含义完全相同。
北京时区是东八区,领先UTC八个小时,在电子邮件信头的Date域记为+0800。如果在电子邮件的信头中有这么一行:
Date: Fri, 08 Nov 2002 09:42:22 +0800
说明信件的发送地的地方时间是二○○二年十一月八号,星期五,早上九点四十二分(二十二秒),这个地方的本地时领先UTC八个小时(+0800,就是东八区时间)。电子邮件信头的Date域使用二十四小时的时钟,而不使用AM和PM来标记上下午。
以这个电子邮件的发送时间为例,如果要把这个时间转化为UTC,可以使用一下公式:
UTC + 时区差 = 本地时间
时区差东为正,西为负。在此,把东八区时区差记为 +0800,
UTC + (+0800) = 本地(北京)时间 (1)
那么,UTC = 本地时间(北京时间))- 0800 (2)
0942 - 0800 = 0142
即UTC是当天凌晨一点四十二分二十二秒。如果结果是负数就意味着是UTC前一天,把这个负数加上2400就是UTC在前一天的时间。例如,本地(北京)时间是 0432 (凌晨四点三十二分),那么,UTC就是 0432 - 0800 = -0368,负号意味着是前一天, -0368 + 2400 = 2032,既前一天的晚上八点三十二分。
纽约的时区是西五区,比UTC落后五个小时,记为 -0500:
UTC + (-0500) = 纽约时间 (3)
UTC = 纽约时间 + 0500 (4)

posted @ 2013-04-22 17:04 landor 阅读(273) | 评论 (0)编辑 收藏

     摘要: struts2单独使用没有任何问题,加入spring后,发现页面表单可以传到struts2的action中,但是返回到页面后,数据丢失,  阅读全文

posted @ 2012-08-19 23:06 landor 阅读(1055) | 评论 (0)编辑 收藏

     摘要: Camel与cxf  阅读全文

posted @ 2011-09-29 13:50 landor 阅读(2323) | 评论 (2)编辑 收藏

     摘要: XPath记录  阅读全文

posted @ 2011-09-15 14:49 landor 阅读(322) | 评论 (0)编辑 收藏

     摘要: JAXB2完成java bean到xml的相互转换  阅读全文

posted @ 2011-06-03 12:04 landor 阅读(7858) | 评论 (1)编辑 收藏

     摘要: Could not parse date - Class: java.text.DateFormat
Caused by: java.text.ParseException: Unparseable date:  阅读全文

posted @ 2011-05-23 15:54 landor 阅读(1059) | 评论 (0)编辑 收藏

     摘要: 转载 - spring 动态数据源切换  阅读全文

posted @ 2011-03-30 21:30 landor 阅读(334) | 评论 (0)编辑 收藏

     摘要: maven一些说明  阅读全文

posted @ 2011-03-04 16:29 landor 阅读(735) | 评论 (0)编辑 收藏

1 分组的时候,?可以不记录一些组,比如:
var str="abc";
var reg=/(?:a)b(c)/g
reg.test(str);
alert(RegExp.$1);//结果为c
此时虽然第一个小括号也满足,但是如果用?:标注之后,它不会被存入正则表达式的缓存中。

2 遇见功能,"?=",意识说目标串中肯定存在什么,比如:
var str="ab4";
var reg
=/ab(?=\d)/g
alert(reg.test(str));//结果为true
意思是第三位肯定是数字;
"?!",意思说目标串中不应该存在什么
var str="ab1";
var reg
=/ab(?!\d)/g
alert(reg.test(str));//结果为false
意思是目标串中的第三位不应该是数字。

posted @ 2011-03-02 16:29 landor 阅读(1747) | 评论 (0)编辑 收藏

1 浏览器会根据content="text/html; charset=gbk"来解析该用什么编码来把这些字节流decode成字符串,并显示;
2 当客户端提交表单的时候,比如以post方式提交,浏览器同样会根据上面的编码,把这些字符串encode成字节流,发送到服务端;
3 在服务端,默认就会认为传过来的东西就是ASCii码,没别的,也就是ISO-8859-1,所以它就去decode,ISO-8859-1中根本没有中文汉字对应的二进制码,没找到,就乱了应该是一堆口吧;
4 解决办法是加一个过滤器,比如gbk,那就设置成request.setCharacterEncoding("GBK");这样服务端在获取字符串的时候,就用GBK去decode这个二进制流了;
5 如果是ajax,问题又来了,因为ajax只支持utf-8编码格式,过程应该是这样:
    a 浏览器通过ajax像server端post数据时,ajax自动将浏览器中的文字用utf-8 encode成二进制流,然后发送到server端;
    b server端如果配置的filter是gbk,那么会用gbk去decode这个二进制流,显然乱麻;但是不应该是一堆口,因为他应该根据二进制流的每两位字节,在GBK编码表中能找到对应的内容,具体的内容是简体文字还是繁体文字还是其他的,就不一定了;
        此时要是偶数个汉字还好(可以把它用gbk进行encode,然后用utf-8进行decode,这样就还原回来了),
        如果是奇数个汉字就出现丢失了(因为一个字符用UTF-8 encode后为3个字节,如果三个字符被encode之后,就是9个字节,当用gbk进行decode 的时候,gbk是用2个字节,结果剩下了一个字节,这个字节在gbk的编码表中不存在(因为gbk编码表都是2个字节的),所以就用?号填充了)。
    c 所以必须在服务端的fiter中对ajax请求进行判断,用jquery为例:
$.ajax({
    
    contentType:
"application/x-www-form-urlencoded;charset=utf-8",

在server端的filter中,可以判断charset是不是空,如果加上上面的代码,那么charset就是utf-8,代码如下:
if (request.getCharacterEncoding() == null) {
    request.setCharacterEncoding(this.encoding);//正常提交请求时候,charset是空的,也就是说request.getCharacterEncoding()是空的;
}

posted @ 2011-03-02 15:51 landor 阅读(548) | 评论 (0)编辑 收藏

     摘要: 用itext生成word  阅读全文

posted @ 2010-04-21 15:00 landor 阅读(3262) | 评论 (2)编辑 收藏

     摘要: oracle的锁和事务的记录  阅读全文

posted @ 2010-02-19 22:23 landor 阅读(1506) | 评论 (0)编辑 收藏