线程通信
案例
package com.itheima.d4;
public class ThreadTest {
public static void main(String[] args) {
Desk desk = new Desk();
//创建3个生产者线程
new Thread(() -> {
while (true) {
desk.put();
}
}, "厨师1").start();
new Thread(() -> {
while (true) {
desk.put();
}
}, "厨师2").start();
new Thread(() -> {
while (true) {
desk.put();
}
}, "厨师3").start();
//创建2个消费者线程
new Thread(() -> {
while (true) {
desk.get();
}
}, "消费者1").start();
new Thread(() -> {
while (true) {
desk.get();
}
}, "消费者2").start();
}
}
package com.itheima.d4;
import java.util.ArrayList;
import java.util.List;
public class Desk {
private List<String> list = new ArrayList<>();
//放一个包子的方法
//厨师1 厨师2 厨师3
public synchronized void put() {
try {
String name = Thread.currentThread().getName();
//判断是否有包子
if (list.size() == 0){
list.add(name + "做了一个肉包子");
System.out.println(name + "做了一个肉包子");
Thread.sleep(2000);
//唤醒别人,等待自己
this.notifyAll();
this.wait();
}else {
//有了包子,不做了
//唤醒别人,等待自己
this.notifyAll();
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//消费者1 消费者2
public synchronized void get() {
try {
String name = Thread.currentThread().getName();
if (list.size() == 1){
//有包子,吃了
System.out.println(name + "吃了" + list.get(0));
list.clear();
Thread.sleep(1000);
this.notifyAll();
this.wait();
}else {
//没有包子
this.notifyAll();
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}