检查java中零循环线程的中断

时间:2017-04-13 11:07:06

标签: java multithreading executorservice

我需要限制一个具有零循环的长时间运行功能。我使用Callable运行该函数,并在未来使用超时值调用get。 AFAIU,future.cancel(true)将为函数线程设置中断标志。但除非我检查并处理longRunningFunction()中的Thread.isInterrupted(),否则我的代码将不知道它必须退出,即使在shutdownNow()之后该函数也不会终止。

  • 如何检查longRunningFunction()中断?检查需要提示,即如果检查放在特定点,那么直到这些点被击中,线程将不会处理中断。
  • 还有其他优雅的时间限制功能吗?
  • 为什么我不能杀死执行程序池中的所有线程?根据{{​​3}},池将永远不会终止,直到线程处理中断并自行终止。
public class Test {

  public void longRunningFunction() {
    /*
   Long running code without loop
     */
  }

  public Void call() {
    try {
      longRunningFunction()
    } catch (InterruptedException exception) {
      logger.error("{} Error : {}", TAG, exception.getStackTrace().join("\n"))
    } catch (Exception exception) {
      logger.error("[call]{} Error : {}", TAG, exception.getStackTrace().join("\n"))
    }
  }

  public static void main(String[] args) {
    ExecutorService executor = Executors.newSingleThreadExecutor()
    Future<Void> future = executor.submit(new Test())
    int timeoutSeconds = 5
    println "Setting timeout to " + timeoutSeconds
    try {
      future.get(timeoutSeconds, TimeUnit.SECONDS) 
    } catch (TimeoutException e) {
      future.cancel(true)
      logger.error("Could not finish processing within {} seconds", timeoutSeconds)
    } finally {
      executor.shutdownNow()
      executor.awaitTermination(3, TimeUnit.SECONDS)
      logger.error("Shutting down")
    }
  }
}

修改 与标记重复相关联的问题表明共享变量是要走的路,这是问题中提到的已知事实。问题是如何无缝地检查该布尔标志,即Thread.isInterrupted

1 个答案:

答案 0 :(得分:1)

除了检查isInterrupted标志之外的唯一方法是杀死线程,控制当前状态并以某种方式协调它。显然,您可以将其封装在一个类中,使其显示为已检查isInterrupted标志。