如果说多个线程间,不仅仅只涉及到对同一个资源的竞争,而是还存在对同一个资源的协作,类似于生产者-消费者模式,这个时候就设计到线程间通信,我们可以通过等待唤醒机制来实现。
情景再现
我们去早餐店吃包子,包子是我们共同的目标,老板卖包子我们买包子。这就是生产者-消费模式
包子类:
public class Baozi { private String name; boolean flag = false;//包子是否准备好 public Baozi(String name) { this.name = name; } }
消费者类:
public class Customer extends Thread { private Baozi baozi; public Customer(String name, Baozi baozi) { super(name); this.baozi = baozi; } @Override public void run() { while (true){ synchronized (baozi){ if (baozi.flag == false){//包子还没有做好 等待 try { System.out.println(getName()+ ": 包子还没做好,老板快点"); baozi.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(getName()+": 包子已经做好了,开吃"); baozi.flag = false; baozi.notify();//吆喝一声 包子吃完了 } } } }
生产者类:
public class Producer extends Thread{ private Baozi baozi; public Producer(String name, Baozi baozi) { super(name); this.baozi = baozi; } @Override public void run() { while (true){ synchronized (baozi){ if (baozi.flag){//包子准备好了,我先休息一下 try { baozi.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(getName()+": 包子没做好,赶紧做"); baozi.flag = true; System.out.println(getName()+": 包子做好了,大家来吃吧"); baozi.notify(); } } } }
public static void main(String[] args) { Baozi baozi = new Baozi("鲜肉大包子"); Customer customer = new Customer("顾客",baozi); Producer producer = new Producer("老板",baozi); producer.start(); customer.start(); }
运行结果:
运行结果如预期,生产者线程负责生产,消费者线程负责消费,分工明确,有条不絮。你耕田来我织布