Ordinary hut

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

2013年4月22日

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)编辑 收藏