用户操作
[即时聊天] [发私信] [加为好友]
吴树根ID:treeroot
141472次访问,排名569好友1人,关注者37
爱好围棋,热爱生活
treeroot的文章
原创 99 篇
翻译 1 篇
转载 12 篇
评论 113 篇
treeroot的公告
blog,simple the best!
最近评论
returnofking:对了,我的E:programmer.ok@163.com
谢谢!
returnofking:楼主好!请问org.rut.util.algorithm.SortUtil是不是你实现的,如果是可不可以给我一份,谢谢!
kruskaluu:好的程序设计!
cqg1220:机柜
cqg1220:机柜
文章分类
收藏
相册
inner
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 wait,notify,sleep,join和线程同步问题收藏

新一篇: 提取英文中的单词 | 旧一篇: API解读:Thread

wait,notify,sleep,join这几个方法很常用,这里涉及到多线程和同步问题,这里稍微解释一下.

1.wait和notify
这两个方法都是Object中的方法,放在一块是因为他们关系非常密切.
wait就是等待这个对象的同步锁,不过调用这个方法必须先获得这个对象的同步锁,就这一点很多人就搞晕了.
这里先解释一下这两个方法,然后给出一个小例子说明.

wait:等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则后收到一个IllegalMonitorStateException,这个是运行时异常.调用这个方法后,就放弃了这个同步锁了.如果不带参数的wait方法就只有等别人唤醒了,如果带一个参数的
化就设置等待最长时间,过了这个时间即使没有人唤醒这个线程也不再等待了.

notify:唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),但是notifyAll可以唤醒所有等待的线程,注意唤醒的时在notify之前wait的线程,之后的没有效果.

这里举一个通俗的例子,两个人共有一个卫生间(每次只能一个人用),他们都要刷牙和方便,他们是这样约定的,轮流用,第一个人先刷牙,然后第二个人刷牙...

class Syn
{
        public static void main(String[] args) throws Exception
        {
            TwoPeople.ONE.start();
            TwoPeople.TWO.start();
        }
}

class TwoPeople extends Thread
{
    private int i=0;
    static Thread ONE=new TwoPeople(1);
    static Thread TWO=new TwoPeople(2);

    static Object washroom=new Object();    
    private TwoPeople(int i){this.i=i;}
    public void run(){
        synchronized(washroom){
            try{
                if(i==1){
                    brush(); //1 
                  washroom.wait(); //2
                    release(); //6   
                    washroom.notify(); //7
                }
            else{
                    brush(); //3
                    washroom.notify(); //4
                    washroom.wait(); //5
                    release(); //8
            }
            }catch(InterruptedException e){e.printStackTrace();}
        }
    }
    private void brush() {
            System.out.println("People "+i+" is brushing !");
             try{Thread.sleep(2000);}catch(InterruptedException e){e.printStackTrace();}
            //延迟两秒看效果
            System.out.println("People "+i+" has burshed !");
    }
    private void release(){
            System.out.println("People "+i+" is releasing !");
            try{Thread.sleep(2000);}catch(InterruptedException e){e.printStackTrace();}
            //延迟两秒看效果
            System.out.println("People "+i+" has released !");
    }
};

上面的代码很简短,而且表明了执行顺序,至于join和sleep还是下次再讨论吧.

发表于 @ 2004年11月10日 11:51:00|评论(loading...)|编辑

新一篇: 提取英文中的单词 | 旧一篇: API解读:Thread

评论

#石头 发表于2005-08-13 10:51:00  IP: 61.186.252.*
这样就没有死锁的可能了么??
#dily 发表于2005-10-04 10:46:00  IP: 211.100.21.*
没有了,这样可以避免死锁,因为JAVA 协定wait以后将释放washroom中的锁
#wolfbrood 发表于2008-03-26 15:40:41  IP: 59.108.23.*
如果第二人先用的话,那就会使两个人都在等待状态。
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © treeroot