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();
}
}
}
}