我有一个循环队列,读取任务并将它们委托给CachedThreadPool的线程。此队列不断填充客户端提交的任务。
如果客户端程序也终止,我希望读者线程终止。起初我认为将读者线程设置为守护进程可以解决问题。但是,这有两个问题:
我也尝试使用关闭钩子解决这个问题,但是钩子永远不会在正确的时间被调用(可能是因为我从构建工具运行客户端?(Scala的SBT))。
有关解决这个问题的任何提示吗?
答案 0 :(得分:2)
您可以使用ExecutorService。它管理队列和线程,可以是shutdown()。
答案 1 :(得分:0)
您可以使用“中毒任务”来告知读者线程它应该停止工作并关闭CachedThreadPool。
答案 2 :(得分:0)
如果你有一个连续的循环,例如你的读者绕过的循环,你应该提供一些方法来通知它停止。对于您实现读者的任何类,这可以像boolean
一样简单。
public class QueueReader implements Runnable
{
private boolean runIndicator = false;
public void run()
{
runIndicator = true;
while (runIndicator)
{
//poll the queue with a timeout
//submit any task from the queue to the cached thread pool
}
//shutdown the cached thread pool
}
public void stop()
{
runIndicator = false;
}
}
请注意,当您致电stop()
时,它仍会等待队列轮询超时,并仍然会提交它在那里找到的任何任务。