java多线程通信-wait/notify/notifyAll
2018-03-29 本文已影响0人
yedp
在java多线程中,如果两个(两个以上)线程需要协作执行,其中一个线程执行前需依赖其他条件。如老板分派任务,员工执行任务。员工需得到老板分派任务后才能执行,在老板分配前等待(wait),老板可以通过notify/notifyAll来通知员工任务已派出,去领任务干活。
其中wait/notify/notifyAll通过锁来控制程序的执行和等待,持有锁时可以执行,等待时释放锁。在执行wait/notify/notifyAll时需先持有锁(在synchronized同步块中执行),否则报IllegalMonitorStateException异常。
其中wait为当前线程等待,notify为唤醒等待线程中的一个,notifyAll为唤醒所有等待的线程。
public class WaitAndNotifyAllTest {
static Queue<Integer> que = new ConcurrentLinkedQueue<Integer>(); //任务队列
static Object obj = new Object();//创建一个全局变量,用来协调各个线程
//老板发布任务
class Leader implements Runnable {
@Override
public void run() {
synchronized(obj) {
for(int i=1;i<=4;i++) {
que.add(i);
System.out.println("老板:"+Thread.currentThread().getName()+"发放任务:"+i);
}
obj.notifyAll();//通知通知任务已发到队
}
}
}
//员工处理任务
class Staff implements Runnable{
@Override
public void run() {
try {
synchronized(obj) {
obj.wait();
if(que.size()>0) {
if (!que.isEmpty()) {
System.out.println("员工:" + Thread.currentThread().getName()+"接到任务:"+que.poll());
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
WaitAndNotifyAllTest test = new WaitAndNotifyAllTest();
startWork(test);
new Thread(test.new Leader()).start();
}
public static void startWork(WaitAndNotifyAllTest test) {
new Thread(test.new Staff()).start();
new Thread(test.new Staff()).start();
new Thread(test.new Staff()).start();
new Thread(test.new Staff()).start();
}
}