生产者消费者是多线程很经典的一个模型
牵涉三个对象:仓库、生产者、消费者
仓库代表共享变量
生产者表示在仓库生产货物
消费者表示从仓库拿出货物
实现思路:利用synchronized+wait()+notify()
对生产者消费者对应的操作用synchronized关键字保证线程安全,通过wait()和notify()实现生产者消费者的通讯
实现方式还有好几种,这里只例举一种,其他几种请参考java线程间通讯的几种方式
demo
public class Programmer { // bug数量,模拟仓库 private int bug = 0; // 写bug,模拟生产者 public synchronized void makingBug() throws InterruptedException { for (; ; ) { if (bug < 5) { System.out.println(Thread.currentThread().getName() + "写了一个bug,当前bug数:" + ++bug); //模拟写bug花费的时间 Thread.sleep(100); } else { System.out.println("======bug太多被老板画了饼,开始修复bug======"); notify(); wait(); } } } // 修bug,模拟消费者 public synchronized void fixingBug() throws InterruptedException { for (; ; ) { if (bug > 0) { System.out.println(Thread.currentThread().getName() + "修复了一个bug,当前bug数:" + --bug); //模拟修复bug花费的时间 Thread.sleep(100); } else { System.out.println("======bug修完了,继续摸鱼======"); notify(); wait(); } } } public static void main(String[] args) throws InterruptedException { // new一个苦逼程序员 Programmer programmer = new Programmer(); new Thread(() -> { try { programmer.makingBug(); } catch (InterruptedException e) { e.printStackTrace(); } }, "摸鱼模式的程序员").start(); new Thread(() -> { try { programmer.fixingBug(); } catch (InterruptedException e) { e.printStackTrace(); } }, "刚被老板画饼的程序员").start(); } }
运行结果: