使用semaphore实现生产者-消费者简单模型
2011-08-19 15:52
561 查看
代码很简单,就不介绍了。需要注意的是,先有生产才有消费,所以与消费者关联的semaphore计数开始为0,而与生产者关联的semaphore计数开始为1。
实现:
测试输出:
Produced: 0
Consumed: 0
Produced: 1
Consumed: 1
Produced: 2
Consumed: 2
Produced: 3
Consumed: 3
Produced: 4
Consumed: 4
Produced: 5
Consumed: 5
Produced: 6
Consumed: 6
Produced: 7
Consumed: 7
Produced: 8
Consumed: 8
Produced: 9
Consumed: 9
Produced: 10
Consumed: 10
Produced: 11
Consumed: 11
Produced: 12
Consumed: 12
Produced: 13
Consumed: 13
Produced: 14
Consumed: 14
Produced: 15
Consumed: 15
Produced: 16
Consumed: 16
Produced: 17
Consumed: 17
Produced: 18
Consumed: 18
Produced: 19
Consumed: 19
Produced: 20
Consumed: 20
Produced: 21
Consumed: 21
Produced: 22
Consumed: 22
Produced: 23
Consumed: 23
Produced: 24
Consumed: 24
Produced: 25
Consumed: 25
Produced: 26
Consumed: 26
Produced: 27
Consumed: 27
Produced: 28
Consumed: 28
Produced: 29
Consumed: 29
实现:
import java.util.concurrent.Semaphore; /** * * Multithreading: consumer-producer model using semaphores * * @author ljs * 2011-08-19 * */ public class ConsumerProducer { //consumer-producer model static class SharedData{ int data = 0; Semaphore semproducer = new Semaphore(1); //set initial count to 0, so a consumer needs to wait until data is available Semaphore semconsumer = new Semaphore(0); public int consume() throws InterruptedException{ try { semconsumer.acquire(); System.out.format(" Consumed: %d%n", data); Thread.sleep(10); return data; } catch (InterruptedException e) { throw e; } finally{ semproducer.release(); } } public void produce(int data) throws InterruptedException{ try { semproducer.acquire(); this.data = data; System.out.format("Produced: %d%n", data); Thread.sleep(10); } catch (InterruptedException e) { throw e; } finally{ semconsumer.release(); } } } //consumer static class ConsumerThread implements Runnable { private SharedData shared; public ConsumerThread(SharedData shared){ this.shared=shared; } public void run(){ for(int i=0;i<30;i++){ try { int data = shared.consume(); //use data } catch (InterruptedException e) { e.printStackTrace(); } } } } //producer static class ProducerThread implements Runnable{ private SharedData shared; public ProducerThread(SharedData shared){ this.shared=shared; } public void run(){ for(int i=0;i<30;i++){ try { shared.produce(i); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) throws Exception { SharedData shared = new SharedData(); Thread producer = new Thread(new ProducerThread(shared),"producer"); Thread consumer = new Thread(new ConsumerThread(shared),"consumer"); consumer.start(); producer.start(); } }
测试输出:
Produced: 0
Consumed: 0
Produced: 1
Consumed: 1
Produced: 2
Consumed: 2
Produced: 3
Consumed: 3
Produced: 4
Consumed: 4
Produced: 5
Consumed: 5
Produced: 6
Consumed: 6
Produced: 7
Consumed: 7
Produced: 8
Consumed: 8
Produced: 9
Consumed: 9
Produced: 10
Consumed: 10
Produced: 11
Consumed: 11
Produced: 12
Consumed: 12
Produced: 13
Consumed: 13
Produced: 14
Consumed: 14
Produced: 15
Consumed: 15
Produced: 16
Consumed: 16
Produced: 17
Consumed: 17
Produced: 18
Consumed: 18
Produced: 19
Consumed: 19
Produced: 20
Consumed: 20
Produced: 21
Consumed: 21
Produced: 22
Consumed: 22
Produced: 23
Consumed: 23
Produced: 24
Consumed: 24
Produced: 25
Consumed: 25
Produced: 26
Consumed: 26
Produced: 27
Consumed: 27
Produced: 28
Consumed: 28
Produced: 29
Consumed: 29
相关文章推荐
- 使用semaphore实现生产者-消费者简单模型
- 使用blockingqueue实现的简单生产者消费者模型
- 使用BlockingQueue实现包饺子( 生产者做面皮,消费者拿面皮包饺子)简单使用
- 用BlockingQueue实现简单的生产者-消费者模型
- JAVA并发框架之Semaphore实现生产者与消费者模型
- 使用swoole的Process实现生产者消费者模型
- 用BlockingQueue实现一个简单的生产者-消费者模型
- 使用ReentrantLock和Condition实现生产者消费者模型
- Java多线程之~~~~使用wait和notify实现生产者消费者模型
- socket 简单实现jms(消费者生产者模型)
- 分布式Web应用----基于Socket+动态代理实现简单RPC 生产者消费者模型
- 使用wait和notifyAll实现生产者消费者模型
- Java多线程使用wait和notify实现生产者消费者模型
- C++实现简单生产者消费者模型
- 简单生产者消费者模型(java实现)
- 简单的生产者和消费者模型——互斥锁和条件变量实现
- Java多线程之~~~~使用wait和notify实现生产者消费者模型
- 简单实现带有数据缓冲池的生产者消费者模型
- 使用swoole的Process实现生产者消费者模型
- 使用BlockingQueue实现生产者和消费者模型