我已经开始学习线程,并使用JDK 5.0中引入的并发包尝试了Java中的Producer使用者问题我编写了以下代码:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
class Producer implements Runnable {
private final BlockingQueue<Integer> objqueue;
Producer(BlockingQueue<Integer> obj) {
objqueue = obj;
}
@Override
public void run() {
int i = 0;
while (i < 10) {
try {
System.out.println("Put : " + i);
objqueue.put(i);
} catch (InterruptedException e) {
}
i++;
}
}
}
class Consumer implements Runnable {
private final BlockingQueue<Integer> objqueue;
Consumer(BlockingQueue<Integer> obj) {
objqueue = obj;
}
@Override
public void run() {
while (true) {
try {
System.out.println("Got : " + objqueue.take());
} catch (InterruptedException e) {
}
}
}
}
public class PCMain {
public static void main(String[] args) {
// create shared object
BlockingQueue<Integer> obj = new LinkedBlockingQueue<Integer>();
Thread prod = new Thread(new Producer(obj));
Thread cons = new Thread(new Consumer(obj));
prod.start();
cons.start();
}
}
当生产者生产最多9个而消费者最多消耗9个时,程序不会终止。我应该删除在消费者中永久存在的while循环。
如何为多个制作人和一个消费者制作? 感谢。
答案 0 :(得分:1)
你有两个线程,一个应该停止一次i == 10
。另一个线程处于无限循环中。您需要向消费线程发出应用程序应该结束的信号。看Poison Pill作为告诉第二个线程停止的方法。
程序本身不会停止,直到消费线程完成。
答案 1 :(得分:0)
删除while循环将导致使用者只消耗生产者给出的1个对象。
最好去Excecuter框架。它有Thread Factory和Thread Pool。你可以用来实现它。
答案 2 :(得分:0)
我认为最简单的方法是修复&#34;您的代码是make the consumer a daemon thread.
Thread prod = new Thread(new Producer(obj));
Thread cons = new Thread(new Consumer(obj));
cons.setDaemon( true );
prod.start();
cons.start();
这实际上不是一个通用的解决方案,但是当一个线程停止发出信号不方便时,请记住这个好方法。