java多线程通信-wait/notify/notifyAll

在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();
}    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,273评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • 读这本书,是因为今年下半年的读书目标,工欲善其事必先利其器。 相比二志成写的读书励志书《书都不会读,你还想成功》,...
    青溪长阅读 192评论 0 0
  • 这叫,先发制人,与先发制于人
    我是小lv你呢阅读 165评论 1 0
  • 如果谁还可以给我生存的理由,那么也只有你,如今一切都没有了,于我一切都无所谓。 -01- 苏木曾亲昵的对我说:“青...
    左郁阅读 266评论 1 3