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

Java 如何恢复由于linkedBlockingQueue.take()而处于阻塞进程中的线程,java,multithreading,blockingqueue,Java,Multithreading,Blockingqueue,我有一个生产者线程,它将继续向linkedBlockingQueue中插入值,并且有多个消费者线程将同时从linkedBlockingQueue中获取()。我让他们继续思考的条件是,当我为制片人挂上的旗子是假的,当它是真的时,他们将停止尝试。但是,我遇到了第二个线程在take()块进程中的问题。我相信这是因为在我的制作人在结束时将标志设置为true之前,其中一个踏板已经在执行take()阻塞方法的run()体内。由于不会有任何新元素添加到linkedBlockingQueue中,它将永远处于阻塞

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

您可以中断等待take()的线程,因此take()将抛出InterruptedException,该异常被捕获,因此执行将进入catch子句

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


在使用者线程中,无论何时获取值,都会检查该值是否为有毒值。如果是,您可以直接返回。

如何中断正在阻塞过程中的线程?您是否介意帮助我考虑一些可能是文件名的有毒值?以及如何退出run()方法?谢谢,我执行了一个永久while循环,然后打破它。然而,我的毒药值是“endOfWorkQueue”,不要认为它是文件名的唯一enuff值…仍然有可能ppl会将其作为文件名输入以退出运行,只需返回调用即可。有关文件名,请检查以下内容:。在windows中,文件名不能包含:\/:*|