你的位置:首页 > 软件开发 > Java > Java线程间通信之wait/notify

Java线程间通信之wait/notify

发布时间:2017-06-18 12:00:19
Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式。先来我们来看下相关定义:    wait() :调用该方法的线程进入WATTING状态,只有等待另外线程 ...

  Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式。先来我们来看下相关定义:

    wait() :调用该方法的线程进入WATTING状态,只有等待另外线程的通知或中断才会返回,调用wait()方法后,会释放对象的锁。

    wait(long):超时等待最多long毫秒,如果没有通知就超时返回。

    notify() : 通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前提是该线程获取到了对象的锁。

    notifyAll():通知所有等待在该对象上的线程。

一个小例子

  我们来模拟个简单的例子来说明,我们楼下有个小小的饺子馆,生意火爆,店里有一个厨师,一个服务员,为避免厨师每做好一份,服务员端出去一份,效率太低且浪费体力。现假设厨师每做好10份,服务员就用一个大木盘子端给客户,每天卖够100份就打烊收工,厨师服务员各自回家休息。

  思考一下,要实现该功能,如果不使用等待/通知机制,那么最直接的方式可能就是,服务员隔一段时间去厨房看看,满10份就用盘子端出去。这种方式有两个很大的弊病:

  1.如果服务员去厨房看的太勤快,服务员太累了,这样还不如每做一碗就端一碗给客人,大木盘子的作用就体现不出来了。具体表现在实现代码层面就是:需要不断的循环,浪费处理器资源。

  2.如果服务员隔很久才去厨房看一下,就无法确保及时性了,可能厨师早都做够10份了,服务员却没观察到。

  针对上面这个例子,使用等待/通知机制就合理的多了,厨师每做够10份,就喊一声“饺子好了,可以端走啦”。服务员收到通知,就去厨房将饺子端给客人;厨师还没做够,即还没收到厨师的通知,就可以稍微休息下,但也得竖起耳朵等候厨师的通知。 

 

Java线程间通信之wait/notifyJava线程间通信之wait/notify
 1 package ConcurrentTest; 2  3 import thread.BlockQueue; 4  5 /** 6  * Created by chengxiao on 2017/6/17. 7 */ 8 public class JiaoziDemo { 9   //创建个共享对象做监视器用10   private static Object obj = new Object();11   //大木盘子,一盘最多可盛10份饺子,厨师做满10份,服务员就可以端出去了。12   private static Integer platter = 0;13   //卖出的饺子总量,卖够100份就打烊收工14   private static Integer count = 0;15 16   /**17    * 厨师18   */19   static class Cook implements Runnable{20     @Override21     public void run() {22       while(count<100){23         synchronized (obj){24           while (platter<10){25             platter++;26           }27           //通知服务员饺子好了,可以端走了28           obj.notify();29           System.out.println(Thread.currentThread().getName()+"--饺子好啦,厨师休息会儿");30         }31         try {32           //线程睡一会,帮助服务员线程抢到对象锁33           Thread.sleep(100);34         } catch (InterruptedException e) {35           e.printStackTrace();36         }37       }38       System.out.println(Thread.currentThread().getName()+"--打烊收工,厨师回家");39     }40   }41 42   /**43    * 服务员44   */45   static class Waiter implements Runnable{46     @Override47     public void run() {48       while(count<100){49         synchronized (obj){50           //厨师做够10份了,就可以端出去了51           while(platter < 10){52             try {53               System.out.println(Thread.currentThread().getName()+"--饺子还没好,等待厨师通知...");54               obj.wait();55               BlockQueue56             } catch (InterruptedException e) {57               e.printStackTrace();58             }59           }60           //饺子端给客人了,盘子清空61           platter-=10;62           //又卖出去10份。63           count+=10;64           System.out.println(Thread.currentThread().getName()+"--服务员把饺子端给客人了");65         }66       }67       System.out.println(Thread.currentThread().getName()+"--打烊收工,服务员回家");68 69     }70   }71   public static void main(String []args){72     Thread cookThread = new Thread(new Cook(),"cookThread");73     Thread waiterThread = new Thread(new Waiter(),"waiterThread");74     cookThread.start();75     waiterThread.start();76   }77 }

原标题:Java线程间通信之wait/notify

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。