【转】Java 生产者消费者

本文详细阐述了如何使用Java实现生产者消费者模式,通过实例展示了使用线程和SynchronousQueue来同步生产与消费的过程。重点讨论了如何在随机数生成达到特定条件时,使生产者和消费者线程终止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自论坛 http://www.iteye.com/topic/1132202

题目:
编写一段生产者/消费者的Java代码,其中生产者每次生产1个0到1000之间的随机数,消费者则把该随机数打印出来。如果产生的随机数为0,则生产者、消费者均退出运行。要求生产者、消费者均使用线程来实现。如题,线程基本的我也会,但是像这样有点复杂的还真不会,求大家帮我啊

给出一个更贴近考题细节的答案。
几点注意: 1. 消费生产者模式原则上讲究生产一个产品后就不能再生产,要等消费完才能生产第二个。因此可以选用SynchronousQueue。当然广义上的消费生产者,用BlockingQueue旗下的任意一个实现类都可以。
2.逻辑很简单,一个线程往queue里存(put),一个线程从queue里取(take)。put和take都是阻塞型的方法,防止while循环死命的循环下去。
3. 随机出0后,producer和consumer都必须停止,如果不用threadpool工具来做,单纯用thread来实现,就要注意,让thread在合适的时候return。比如生产者随机到0时,return并且依然把0存入queue,消费者取出0时,线程return。


import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;

public class Test {

BlockingQueue<Integer> queue = new SynchronousQueue<Integer>();

Random rd = new Random();

class Producer extends Thread {
@Override
public void run() {
while (true) {
int number = rd.nextInt(1000);
System.out.println("Producer Generate : " + number);
try {
queue.put(number);
if (number == 0) {
System.out.println("Producer stoped.");
return;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

}

class Consumer extends Thread {
@Override
public void run() {
while (true) {
try {
if (queue.take() == 0) {
System.out.println("Consumer stoped.");
return;
}
;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public void startTest() {
Producer producer = new Producer();
Consumer consumer = new Consumer();
producer.start();
consumer.start();
}

public static void main(String[] args) {
new Test().startTest();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值