简介
- 最常见的模式:
生产者-消费者模式
线程通信模型
常见API
生产者
抢到资源,生成资源,自己进入等待,唤醒消费者
消费者
抢到资源,消费数据,自己进入等待,唤醒生产者
定义容器
- 定义一个容器:
- 存储
共享资源
- 定义
生产方法
和消费方法
import java.util.ArrayList;
import java.util.List;public class Desk {private List<String> list = new ArrayList<>();// 生产者 生成一个包子public synchronized void put(){try {String name = Thread.currentThread().getName();if (list.size() == 0){list.add(name + "做的包子");Thread.sleep(1000);System.out.println(name + "生产了一个包子");// 通知消费者消费 自己进入等待this.notifyAll();this.wait();}else{// 通知消费者消费 自己进入等待System.out.println(name + "等待消费者吃包子");this.notifyAll();this.wait();}} catch (InterruptedException e) {throw new RuntimeException(e);}}// 消费者 消费一个包子public synchronized void get(){try {String name = Thread.currentThread().getName();if (list.size() == 0){System.out.println(name + "等待包子");// 通知生产者生产 自己进入等待this.notifyAll();this.wait();}else{Thread.sleep(1000);System.out.println(name + "吃了" + list.get(0));list.clear();// 通知生产者生产 自己进入等待this.notifyAll();this.wait();}} catch (InterruptedException e) {throw new RuntimeException(e);}}}
主线程中生成五个线程,循环执行
public class Main {public static void main(String[] args) {// 需求:3个生产者,2个消费者,一个桌子Desk desk = new Desk();// 创建3个生产者new Thread(new Runnable() {@Overridepublic void run() {while (true){desk.put();}}},"厨师1").start();new Thread(new Runnable() {@Overridepublic void run() {while (true){desk.put();}}},"厨师2").start();new Thread(new Runnable() {@Overridepublic void run() {while (true){desk.put();}}},"厨师3").start();// 创建2个消费者new Thread(new Runnable() {@Overridepublic void run() {while (true){desk.get();}}},"吃货1").start();new Thread(new Runnable() {@Overridepublic void run() {while (true){desk.get();}}},"吃货2").start();}
}