等待阻塞队列时中断

时间:2013-03-26 10:47:46

标签: java multithreading concurrency executorservice

我的Runnable来自ExecutorSychronousQueue.take中阻止了runnable等待。如何在take时确保executor.shutdown被中断?

3 个答案:

答案 0 :(得分:2)

你可以做这样的事情吗?

 executor.shutdown();
    if (!executor.awaitTermination(SHUTDOWN_TIME)) {
        executor.shutdownNow();
    }

答案 1 :(得分:2)

+1 @Eugene。 ExecutorService.shutdown()关闭线程池,但任何提交的作业将继续运行直到完成。如果改为使用shutdownNow(),它实际上会中断线程。这并不意味着它们会立即停止,但它确实意味着如果它们在queue.take()queue.take()的下一次调用中被阻止,它将抛出InterruptedException,以便线程可以退出。

引用Javadocs:

  

尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。

     

除了尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。

当你的线程调用queue.take()时,他们应该有类似下面的代码:

  try {
      work = queue.take();
      ...
  } catch (InterruptedException e) {
      // re-interrupt the thread which is always a good pattern
      Thread.currentThread().interrupt();
      // quit the processing thread
      return;
  }

答案 2 :(得分:1)

javadoc of take中所指定,当线程等待中断时,它将抛出InterruptedException。因此,您需要确保执行程序实现将在shutdown上的所有线程上调用Thread.interrupt()