我正在尝试编写一个简单的生产者消费者程序,使用一个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());
}
}
}
}
}
答案 0 :(得分:3)
问题是你在接收者的堆栈实例上做同步,所以不管你有多少只有一个人会在时间处理。所以不需要有多个收件人而不是:)
首先,您应该更改算法以摆脱同步。
我只是谷歌生产者与java中的多个消费者,并根据您的喜好获得一些灵感。
<强>更新强>:
您只需在消费者中说:
Consumer implements Runnable{
public void run() {
while (true){
synchronized(sharedStack){
这意味着,只有参与声明synchronized(sharedStack){
的第一个消费者才能进入,其他人会等到一个人离开集团}
。
这意味着您只能及时处理一位消费者。其他人等待,并且第一个幸运者将处理下一次迭代(在您的情况下,它是与之前处理迭代的人相同)。
有关同步块的详细信息,请参阅official docs。