【Java多线程二】多路条件解决生产者消费者问题
Java  /  管理员 发布于 5年前   312
package com.tom;import java.util.LinkedList;import java.util.Queue;import java.util.concurrent.ThreadLocalRandom;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class Plate<T> { private final Lock lock = new ReentrantLock(); private final Condition PLATE_NOT_FULL = lock.newCondition(); private final Condition PLATE_NOT_EMPTY = lock.newCondition(); private final Queue<T> plates = new LinkedList<T>(); private int size; public Plate(int size) { this.size = size; } public void produce(T fruit) { lock.lock(); try { if (plates.size() >= size) { try { System.out.println(Thread.currentThread().getName() + ", The plate is full..waiting to put into the plate"); PLATE_NOT_FULL.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + ", The plate is not full..put the fruit into the plate: " + fruit); plates.offer(fruit); PLATE_NOT_EMPTY.signalAll(); } finally { if (lock != null){ lock.unlock(); } } } public T consume() { T fruit = null; lock.lock(); try { if (plates.isEmpty()) { try { System.out.println(Thread.currentThread().getName() + ", The plate is empty..waiting to consume"); PLATE_NOT_EMPTY.await(); } catch (InterruptedException e) { e.printStackTrace(); } } fruit = plates.poll(); System.out.println(Thread.currentThread().getName() + ",The plate is not empty, consume the fruit: " + fruit); PLATE_NOT_FULL.signalAll(); } finally { if (lock != null){ lock.unlock(); } } return fruit; }}public class ThreadCommunication { private static volatile boolean shutdown = false; public static void main(String[] args) { final Plate<Integer> plate = new Plate<Integer>(8); Thread[] consumers = new Thread[3]; for (int i = 0; i < consumers.length; i++) { consumers[i] = new Thread() { @Override public void run() { while (!shutdown) { plate.consume(); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }; consumers[i].start(); } Thread[] producers = new Thread[2]; for (int i = 0; i < producers.length; i++) { producers[i] = new Thread() { @Override public void run() { while (!shutdown) { plate.produce(ThreadLocalRandom.current().nextInt(100, 1000)); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }; producers[i].start(); } try { Thread.sleep(6000); shutdown = true; } catch (InterruptedException e) { e.printStackTrace(); } }}
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号