生产者消费者使用blockqueue

时间:2015-02-03 18:19:51

标签: java multithreading

我已经开始学习线程,并使用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循环。

如何为多个制作人和一个消费者制作? 感谢。

3 个答案:

答案 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();

这实际上不是一个通用的解决方案,但是当一个线程停止发出信号不方便时,请记住这个好方法。