Java 多线程编程实战: 生产者和消费者
Java多线程编程实战
生产者与消费者
所谓的生产者消费者模型,是通过一个容器来解决生产者和消费者的强耦合问题。 生产者不断地生产,消费者不断地消费,可是消费者消费的产品是生产者生产的,这就必然存在一个中间容器(类似于货架)。
通过多线程编程,来模拟一个餐厅的2个厨师和3个顾客,假设厨师炒出一个菜的时间为3秒,顾客吃掉菜品的时间为4秒。
import java.util.ArrayList; import java.util.Date; import java.util.List; public class Main { private static final List<Object> list = new ArrayList<>(); //模拟餐桌 public static void main(String[] args) { Thread c1 = new Thread(() -> { //厨师1 Main.add(); }); c1.setName("厨师1"); Thread c2 = new Thread(() -> { //厨师2 Main.add(); }); c2.setName("厨师2"); c1.start(); c2.start(); Thread e1 = new Thread(() -> { //顾客1 Main.remove(); }); e1.setName("食客1"); Thread e2 = new Thread(() -> { //顾客2 Main.remove(); }); e2.setName("食客2"); Thread e3 = new Thread(() -> { //顾客3 Main.remove(); }); e3.setName("食客3"); e1.start(); e2.start(); e3.start(); } private static void add(){ //出菜 while(true){ try { Thread.sleep(3000); } catch (InterruptedException e) { throw new RuntimeException(e); } synchronized (list){ //加把锁 list.add(new Object()); System.out.println(new Date() + Thread.currentThread().getName()+"上菜啦"); list.notify(); //唤醒remove的wait } list.add(new Object()); } } private static void remove(){ //出菜 while(true){ try { synchronized (list) { //加把锁 while (list.isEmpty()) list.wait(); //等待 list.remove(0); System.out.println(new Date() + Thread.currentThread().getName()+"吃完啦"); } Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } } } }