gpt4 book ai didi

java - 无法使用 Poison Pill 停止生产者/消费者线程

转载 作者:行者123 更新时间:2023-11-30 07:18:18 25 4
gpt4 key购买 nike

我有非常简单的代码,它使用“Poison Pill”模拟生产者/消费者停止技术。

我有生产者类:

public class Producer extends Thread {

private final BlockingQueue<String> queue;

public Producer(BlockingQueue<String> queue) {
this.queue = queue;
}

@Override
public void run() {
try {
while (true) {
//unblocking this line will cause the code to stop after intrrupt
//System.out.println("1");
queue.put("hello world");
}
} catch (InterruptedException e) {
try {
queue.put(Main.POISON_PILL);
} catch (InterruptedException e1) {
}
}
}
}

消费类:

public class Consumer extends Thread {

private final BlockingQueue<String> queue;

public Consumer(BlockingQueue<String> queue) {
this.queue = queue;
}

@Override
public void run() {
try {
while (true) {
String s = queue.take();
if (s.equals(Main.POISON_PILL))
break;
else
System.out.println(s);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}

现在的主要功能:

public static String POISON_PILL = "POISON_PILL";

public static void main(String[] args) {

BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
producer.start();
consumer.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {

} finally {
producer.interrupt();
}
}

即使在 producer.interrupt() 调用之后,也不知道什么原因,“hello world”永远在控制台中打印。

我不明白的第二件事是为什么取消注释 System.out.println("1"); 会导致程序在生产者线程中断后退出。

请帮助我理解原因。

最佳答案

我的猜测是,您的生产者只是比您的消费者运行得快得多,以至于您似乎永远不会用完元素。创建一个没有显式容量的 LinkedBlockingQueue 会创建一个容量为 Integer.MAX_VALUE 的队列,这足以让消费者保持打印一段时间。

这也可能是当您添加 System.out.println 行时它开始工作的原因;通过要求控制台 I/O,它会使生产者的速度减慢到消费者能够跟上的程度。

尝试创建一个容量较小的 LinkedBlockingQueue,例如 100 左右。

关于java - 无法使用 Poison Pill 停止生产者/消费者线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15489067/

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