正在读取队列的关闭守护程序线程

时间:2011-01-28 09:55:06

标签: java multithreading daemon threadpool

我有一个循环队列,读取任务并将它们委托给CachedThreadPool的线程。此队列不断填​​充客户端提交的任务。

如果客户端程序也终止,我希望读者线程终止。起初我认为将读者线程设置为守护进程可以解决问题。但是,这有两个问题:

  • 读者线程需要在退出之前读取队列中仍然存在的所有事件。
  • 读者线程有一个CachedThreadPool。由于其中的线程不是守护进程,程序将不会退出。如果我将池中的所有线程都设置为守护进程,那么它们不会处理所有工作(可能是因为读取器将在处理所有队列之前终止)。

我也尝试使用关闭钩子解决这个问题,但是钩子永远不会在正确的时间被调用(可能是因为我从构建工具运行客户端?(Scala的SBT))。

有关解决这个问题的任何提示吗?

3 个答案:

答案 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()时,它仍会等待队列轮询超时,并仍然会提交它在那里找到的任何任务。