java技术

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();
}    
}
上一篇下一篇

猜你喜欢

热点阅读