java - 如何恢复由于 linkedBlockingQueue.take() 而处于阻塞进程的线程

标签 java multithreading blockingqueue

我有一个生产者线程,它将不断将值插入到 linkedBlockingQueue 中,并且有多个消费者线程将同时从此 linkedBlockingQueue 中 take() 。我让他们继续思考的条件是,当我的制作人完成标志是假的,当它是真的时,他们将停止尝试。但是我遇到了我的第二个线程位于 take() block 进程中的问题。我相信这是因为在我的生产者在结束时将标志设置为 true 之前,其中一个线程已经在执行 take() 阻塞方法的 run() 主体内部。由于不会有任何新元素添加到 linkedBlockingQueue 中,因此它将处于永远阻塞的过程中。我该如何纠正这个问题?

最佳答案

解决此问题的标准方法是让生产者线程在完成时在共享队列中插入一些有毒值(您选择的一些特殊值)。您应该设置等于 numOfThreads 的有毒值数量。

在消费者线程中,每当您获取一个值时,都会检查该值是否为有毒值。如果是,您可以返回。

关于java - 如何恢复由于 linkedBlockingQueue.take() 而处于阻塞进程的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27247559/

相关文章:

java - ArrayBlockingQueue 有两个条件 : notFull and notEmpty. 如何理解这两个条件?它是一种锁 split ?

java - Runnable 使用 ExecutorService 和 BlockingQueue 锁定(停放)

java - 如何终止从阻塞队列中检索

java - 如何迭代 Java 枚举?

java - 如何从 Java 列表中获取一种类型的所有实例?

java - String .length() 函数未定义

java - Spring Batch JobExecutionException - ConcurrencyFailureException

java - 如何仅在 Spring 中通过注释配置组件扫描?

java - 如何在多线程聊天中使用 swing 处理输入重复名称错误

multithreading - csharp 中的 grpc channel / stub 线程是否安全