1.线程间通信的出现场景
模拟生产者-消费者案例说明:
生产者生成水果,如果水果没有被买走,那么就不生产处于等待状态,如果水果被消费者买走,这时候消费者就会通知生产者水果已买走请生产,消费者同理,如果水果已经生成出来,那么就买走,买走之后再通知生产者水果没了请生产
2.线程间通信的实现
通信规则 (1)线程间的通信共享数据一定要有同步代码块synchronized
(2)一定要有wait和notify,而且二者一定是成对出现
(3)生产者和消费者的线程实现一定是在while(true)里边
案例实现:(1)共享资源类(水果篮),代码如下:
public class Basket { private boolean isEmpty; public void setEmpty(boolean empty) { isEmpty = empty; } public boolean isEmpty(){ return isEmpty; } }
(2)生产者,代码如下:
public class Producer extends Thread{ private Basket basket; public Producer(Basket basket){ super(); this.basket = basket; } @Override public void run(){ while (true){ //定义一个同步代码块 synchronized (basket){ try { if(!basket.isEmpty()){ //线程等待状态 basket.wait(); } System.out.println("生产水果"); //通知在这个共享对象上等待的线程 basket.setEmpty(false); basket.notify(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
(3)消费者,代码如下:
public class Consumer extends Thread{ private Basket basket; public Consumer(Basket basket){ super(); this.basket = basket; } @Override public void run(){ while (true){ //定义一个同步代码块 synchronized (basket){ try { if(basket.isEmpty()){ //线程等待状态 basket.wait(); } System.out.println("消费水果"); //通知在这个共享对象上等待的线程 basket.setEmpty(true); basket.notify(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }