import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.Semaphore;
public class ProductConsume {
static WareHouse buffer = new WareHouse();
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
Thread thread1 = new Thread(new Producer());
thread1.setName(String.format("Producer%d", i));
thread1.start();
Thread thread2 = new Thread(new Consumer());
thread2.setName(String.format("Consumed%d", i));
thread2.start();
}
}
static class WareHouse {
final Semaphore Full = new Semaphore(0);
final Semaphore Empty = new Semaphore(10);
final Semaphore mutex = new Semaphore(1);
Queue<Object> items = new LinkedList<>();
public void put(Object item) throws InterruptedException {
Empty.acquire();
mutex.acquire();
try {
items.add(item);
System.out.printf("%s, in : %d, remain: %d\n", Thread.currentThread().getName(), item, buffer.items.size());
} finally {
mutex.release();
Full.release();
}
}
public void take() throws InterruptedException {
Full.acquire();
mutex.acquire();
try {
Object item = items.poll();
System.out.printf("%s, out: %d, remain: %d\n", Thread.currentThread().getName(), item, buffer.items.size());
} finally {
mutex.release();
Empty.release();
}
}
}
static class Producer implements Runnable {
static int item;
@Override
public void run() {
while (true) {
int n = item++;
try {
buffer.put(n);
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Consumer implements Runnable {
@Override
public void run() {
while (true) {
try {
buffer.take();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
生产者-消费者问题
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 一、信号量 信号量是一个与队列有关的整型变量。 可以初始化成非负数; semWait操作使信号量减1。若值为负数,...
- 多线程并发之生产者消费者问题与读者写者问题 引言 在程序界,有句流行语:我有一个问题,使用线程后,现在有了两个问题...
- 也叫缓存绑定问题(bounded- buffer),是一个经典的、多进程同步问题。 单生产者和单消费者 有两个进程...
- 题目: 桌上有个能剩得下五个水果的空盘子。爸爸不停地向盘中放苹果和桔子,儿子不停地从盘中取出桔子享用,女儿不停地从...
- 问:Java 中如何通过代码解决生产消费者问题? 答:生产者消费者问题是多线程并发的一个经典问题,其问题的核心模型...