一个线程大部分时间都在运行

时间:2013-10-29 23:18:14

标签: java multithreading concurrency producer-consumer

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

正如您在下面的代码中看到的,我有一个启动线程的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());                   
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

问题是你在接收者的堆栈实例上做同步,所以不管你有多少只有一个人会在时间处理。所以不需要有多个收件人而不是:)

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

我只是谷歌生产者与java中的多个消费者,并根据您的喜好获得一些灵感。

<强>更新

您只需在消费者中说:

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

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

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

有关同步块的详细信息,请参阅official docs