考虑经典的排队问题,其中一个线程正在生产一些数据,另一个是消费它。为了使问题更有趣,假设生产者必须等待,直到它会产生更多的数据消费完毕之前。
在一个轮询系统,消费者会浪费大量的CPU周期,而它等待着生产者生产。一旦生产结束了,就开始轮询,浪费更多的CPU周期等待消费者完成,依此类推。显然,这种情况是不希望的。
为了避免轮询,Java包括通过下面的方法优雅的进程间通信机制:
-
wait( ): 这个方法告诉调用线程放弃监视器和进入睡眠状态,直到其他线程进入同一监视器和调用notify()。
-
notify( ): 这种方法唤醒第一个线程调用wait()在同一个对象上。
-
notifyAll( ): 这种方法唤醒所有调用wait()的同一个对象上的线程。最高优先级的线程将首先运行。
这些方法被实现为final的方法在Object,因此所有的类都有它们。这三种方法都只能从一个同步的上下文中被调用。
这些方法的对象中声明。各种形式的wait( ) 存在,使可以指定一段时间等待。
例子:
下面的示例程序包括四个类:Q,想同步队列,Producer,也就是生产队列的条目线程对象;Consumer,即消耗队列的条目线程对象和PC,tiny类创建一个Q,生产者和消费者。
写这个程序在Java中正确的方法是使用wait()和notify()方法,以在两个方向的信号,如下所示:
Put: 1
Got: 1
Put: 2
Got: 2
Put: 3
Got: 3
Put: 4
Got: 4
Put: 5
Got: 5
这让自己变得更加强。