1

我正在尝试编写一个简单的生产者消费者程序,使用一个堆栈,一个生产者和多个消费者,

正如您在以下代码中看到的,我有一个启动线程的 PC 类。问题是在结果中我只看到一个消费者从堆栈中弹出。为什么会这样?为什么它不让其他消费者也从堆栈中弹出?

class PC{
    static Stack<Integer> sharedStack = new Stack<Integer>();
    final static int MAX_SIZE = 10;
    public static void main(String[] args){
        new PC();
    }
    public PC(){
        new Thread(new Producer() , "Producer").start();
        Consumer consumer = new Consumer();
        for (int i = 1 ; i < 10 ; i++)
            new Thread(consumer , "Consumer " + i).start();
    }
    class Producer implements Runnable{
        Random rnd = new Random();
        public void run() {
            while(true){
                synchronized (sharedStack) {
                    if (sharedStack.size() < MAX_SIZE){
                        int r = rnd.nextInt(1000);
                        System.out.println(Thread.currentThread().getName() + " produced :" + r);
                        sharedStack.push(r);
                        sharedStack.notifyAll();
                    }                   
                }
            }
        }
    }
    class Consumer implements Runnable{
        public void run() {
            while (true){
                synchronized(sharedStack){
                    if (sharedStack.isEmpty()){
                        try {
                            sharedStack.wait();
                        } catch (InterruptedException e) {e.printStackTrace();}
                    }
                    System.out.println(Thread.currentThread().getName() + " consumed :" + sharedStack.pop());                   
                }
            }
        }
    }
}
4

1 回答 1

3

问题是您在接收器中的堆栈实例上进行同步,因此无论您有多少个,一次都会处理。所以没有必要拥有一个以上的接收者:)

首先,您可能应该更改您的算法以摆脱同步。

我只是在 java 中搜索具有多个消费者的生产者,并根据您的喜好获得一些灵感。

更新

你只是在你的消费者中说:

 Consumer implements Runnable{
        public void run() {
            while (true){
                synchronized(sharedStack){

这意味着,只有第一个收到该声明的消费者synchronized(sharedStack){才能进入,其他人将等到该消费者离开该集团}

因此,这意味着您只能及时处理一位消费者。其他人等待,第一个幸运者将处理下一次迭代(在您的情况下,它与之前处理迭代的人相同)。

有关同步块的更多信息,请参阅官方文档

于 2013-10-29T23:28:16.933 回答