Shutdown Daemon Thread, который читает в очереди - PullRequest
0 голосов
/ 28 января 2011

У меня есть поток, который зацикливает очередь, читает задачи и делегирует их в CachedThreadPool. Эта очередь постоянно заполняется отправленными клиентом задачами.

Я хочу завершить поток чтения, если клиентские программы также завершаются. Сначала я подумал, что установка потока чтения в качестве демона решит проблему. Однако с этим есть две проблемы:

  • Поток читателя должен прочитать все события, оставшиеся в очереди, до его выхода.
  • Поток читателя имеет CachedThreadPool. Поскольку потоки в нем не являются демонами, программа не будет завершена. Если я установлю все потоки в пуле как демон, каким-то образом они не будут обрабатывать всю работу (возможно, потому что программа чтения прекратит работу перед обработкой всей очереди).

Я также пытался решить эту проблему с помощью ловушки завершения работы, однако ловушка никогда не вызывается в нужное время (возможно, потому что я запускаю клиент из инструментов сборки?

Есть какие-нибудь намеки на то, чтобы обойти это?

Ответы [ 3 ]

2 голосов
/ 28 января 2011

Вы можете использовать вместо этого ExecutorService. Он управляет очередью и потоком (ами) и может быть отключен ().

0 голосов
/ 28 января 2011

Когда у вас есть непрерывный цикл, например, тот, который вращает ваш читатель, вы должны предоставить какой-нибудь способ уведомить его об остановке. Это может быть просто как 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() он все еще будет ожидать истечения времени ожидания в опросе очереди и будет по-прежнему отправлять все найденные там задачи.

0 голосов
/ 28 января 2011

Вы можете использовать «задание на отравление», чтобы сообщить потоку считывателя, что он должен прекратить свою работу и завершить работу CachedThreadPool.

...