生产者消费者问题——Java方案

本文通过实现经典生产者-消费者问题,复习了Java多线程编程,详细介绍了生产者类、消费者类及管程的实现过程,并展示了程序运行的部分输出结果。

最近有个同学让我帮忙写下多线程,由于不经常使用Java,对多线程忘了差不多了,于是就想来复习一下。然后就自然想到了著名的生产者-消费者问题,于是就写了个小程序来练下手o(∩_∩)o


package stwolf.hustbaidu.java.learn; public class ProducerConsumer { public static final int N = 10; static Producer myProducer = new Producer(); static Consumer myConsumer = new Consumer(); static Monitor myMonitor = new Monitor(); public static void main(String args[]) { myProducer.start(); myConsumer.start(); } static class Producer extends Thread //生产者类 { @Override public void run() { int item; while (true) { item = produce_item(); myMonitor.insert(item); } } private int produce_item() //实际生产活动 { return (int)Math.random(); } } static class Consumer extends Thread //消费者类 { @Override public void run() { int item; while (true) { item = myMonitor.remove(); consume_item(item); } } private void consume_item(int item) //实际生产活动 { } } static class Monitor //管程 { private int[] buffer = new int[N]; private int count = 0, low = 0, high = 0; public synchronized void insert(int val) { if (count == N) //缓冲区满,休眠 { sleep(); } System.out.println("Produce" + high); buffer[high] = val; high = (high + 1) % N; //设置下一项索引 count++; if (count == 1) //若消费者在休眠,唤醒消费者 { notify(); } } public synchronized int remove() { int val; if (count == 0) ////缓冲区空,休眠 { sleep(); } System.out.println("Consume" + low); val = buffer[low]; low = (low + 1) % N; //设置下一项索引 count--; if (count == N - 1) //若生产者在休眠,唤醒生产者 { notify(); } return val; } private void sleep() { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }

程序的部分输出如下:

Produce0 Consume0 Produce1 Consume1 Produce2 Consume2 Produce3 Consume3 Produce4 Consume4 Produce5 Consume5 Produce6 Consume6 Produce7 Consume7 Produce8 Consume8 Produce9 Consume9 Produce0 Consume0 Produce1 Produce2 Produce3 Produce4 Produce5 Produce6 Produce7 Produce8 Produce9 Produce0 Consume1 Consume2 Consume3 Consume4 Consume5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值