import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ProducerAndConsumer {
public static void main(String[] args) {
//准备15个线程,5个用于生产者,10个用于消费者
ExecutorService executorService = Executors.newFixedThreadPool(15);
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
executorService.submit(new Producer(list,10));
}
for (int i = 0; i < 10; i++) {
executorService.submit(new Consumer(list));
}
}
public static class Producer implements Runnable{
final ArrayList<Integer> list;
//产品的最大数量
int maxProductions;
//在构造函数中传入列表
public Producer(ArrayList<Integer> list, int maxProductions) {
this.list = list;
this.maxProductions = maxProductions;
}
@Override
public void run() {
//死循环
while (true){
//对list加锁
synchronized (list){
//判断产品是否达到最大数量
//注意这里不要用if,要用while
//因为当前线程被唤醒时,如果其他线程已经率先完成生产(此时数量已经达到最大),此线程再生产就超过了最大数量
while(list.size()==maxProductions){
System.out.println("生产者停止生产,"+"产品数量:"+list.size());
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("生产者开始生产,"+"产品数量:"+list.size());
}
list.add(1);
list.notifyAll();
System.out.println("生产者生产完成,"+"产品数量:"+list.size());
}
}
}
}
public static class Consumer implements Runnable{
final ArrayList<Integer> list;
public Consumer(ArrayList<Integer> list) {
this.list = list;
}
@Override
public void run() {
while (true){
synchronized (list){
//判断产品数量是否为0,同样用while判断
while(list.size()==0){
System.out.println("消费者停止消费,"+"产品数量:"+list.size());
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费者开始消费,"+"产品数量:"+list.size());
}
list.remove(0);
list.notifyAll();
System.out.println("消费者消费完成,"+"产品数量:"+list.size());
}
}
}
}
}
Android面试笔记——生产者消费者模式
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 45、线程池ThreadPoolExecutor 45.1、创建线程池 Java通过Executors提供四个...