gpt4 book ai didi

java while(true) 轮询队列没有被执行

转载 作者:行者123 更新时间:2023-12-01 18:37:22 27 4
gpt4 key购买 nike

我正在学习 java,并且正在实现一个基本的生产者-消费者用例。我有一个队列和一些生产者正在将东西插入到这个队列中。我还有一个实现 Callable 的 Consumer。下面是 Consumer 的实现:

public String call() throws Exception
{
while(true) {
if(!queue.isEmpty()) {
String prod = queue.poll();
System.out.println(name + " consumed " + prod);
}
}
}

制作人:

@Override
public void run() {
System.out.println("adding " + name);
queue.add(name);
}

主要:

public static void main(String[] args) {
Test();
}

public static void Test()
{
Queue<String> queue = new LinkedList<String>();

ScheduledExecutorService lots_of_producers = Executors.newScheduledThreadPool(10);
ExecutorService consumers = Executors.newFixedThreadPool(1);


for(int i=0; i<1; i++) {
Consumer consumer = new Consumer("consumer_" + i, queue);
consumers.submit(consumer);
}

for(int i=0; i<5; i++) {
Producer producer = new Producer("producer_" + i, queue);
lots_of_producers.scheduleWithFixedDelay(producer, i, 5, TimeUnit.SECONDS);
}
}

生产者工作正常,但消费者不工作,因为我没有看到消费者的日志。

但是,如果我更改消费实现并让消费者线程在queue.isEmpty()为true时 hibernate ,消费者将按预期工作。

public String call() throws Exception
{
while(true) {
if(!queue.isEmpty()) {
String prod = queue.poll();
System.out.println(name + " consumed " + prod);
} else {
Thread.sleep(100);
}
}
}

有人可以解释为什么消费者线程在第一种情况下不起作用吗?

对于第一种情况,在 Eclipse 中我可以看到消费者线程没有死。我暂停了它,它正在这条线上工作

        if(!queue.isEmpty()) {

现在,如果我手动跨过,消费者将工作并打印日志。但一旦我恢复并让它自行运行,它就会再次卡住。

我正在尝试更多地了解java。

谢谢!

-埃尔本

最佳答案

本例中存在多个问题。

  1. 您的第一个实现运行一个紧密的循环。根据平台和线程模型,它可能根本不允许任何其他线程运行。这就是生产者线程没有机会将数据放入队列的原因。
  2. 您的第二个实现(使用Thread.sleep)为其他线程提供了运行的机会。这就是为什么您看到消费者消费某些东西的原因,因为生产者线程有机会将数据放入队列中。然而,即使是这一点也可能会失败,因为您没有同步生产者和消费者。请参阅Java Tutorial - Synchronization用于学习线程同步。

关于java while(true) 轮询队列没有被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21359691/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com