使用waitnotify实现多线程同步.docVIP

  • 0
  • 0
  • 约3.26千字
  • 约 3页
  • 2017-11-20 发布于北京
  • 举报
使用waitnotify实现多线程同步

使用wait,notify实现多线程同步(转) 2008-11-06 22:47 ??????? 笔注:本文来自网络 ??????? 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.printl

文档评论(0)

1亿VIP精品文档

相关文档