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();
}
}
}
}
}
生产者-消费者问题
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、信号量 信号量是一个与队列有关的整型变量。 可以初始化成非负数; semWait操作使信号量减1。若值为负数,...
- 多线程并发之生产者消费者问题与读者写者问题 引言 在程序界,有句流行语:我有一个问题,使用线程后,现在有了两个问题...
- 也叫缓存绑定问题(bounded- buffer),是一个经典的、多进程同步问题。 单生产者和单消费者 有两个进程...
- 题目: 桌上有个能剩得下五个水果的空盘子。爸爸不停地向盘中放苹果和桔子,儿子不停地从盘中取出桔子享用,女儿不停地从...
- 问:Java 中如何通过代码解决生产消费者问题? 答:生产者消费者问题是多线程并发的一个经典问题,其问题的核心模型...