我有一个生产者线程,它将继续将值插入到linkedBlockingQueue中,并且有多个消费者线程将同时从此linkedBlockingQueue获取()。他让我们继续思考的条件是当我的制作人的旗帜已经完成时,他们会在真实时停止尝试。但是我遇到了我的第二个线程在take()块过程中的问题。我相信这是因为在我的生产者在结束时将标志设置为true之前,其中一个脚本已经在执行take()阻塞方法的run()体内。由于不会在linkedBlockingQueue中添加任何新元素,因此它将处于永久阻塞过程中。我该如何纠正这个问题?
答案 0 :(得分:2)
解决此问题的一种标准方法是让生产者线程在完成后在共享队列中插入一些有毒值(您选择的某些特殊值)。你应该把一些毒药值等于numOfThreads。
在消费者线程中,无论何时获取值,都要检查该值是否为有毒值。如果是,你可以回来。
答案 1 :(得分:0)
你可以中断正在等待take()的线程,所以take()将抛出被捕获的InterruptedException,因此执行将进入catch子句。