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();
}
}
}
}
}
原文:https://www.cnblogs.com/smallVampire/p/12035226.html