如何在Executor服务中执行长时间执行任务(例如,无限循环)

以下是示例程序。 如果我取消注释Thread.sleep它工作正常。 但是可能有一些需要,我们不确定在Call方法中编写的代码花了多少时间,可能是一个无限的时间。 或者,可能是一个糟糕的程序,其中Call方法中的DB连接逻辑需要更多时间,我们需要杀死。

你可以告诉我,为什么下面的代码不起作用,如果我评论thread.sleep以及如何杀死并停止它而不编写Thread.interrupted条件。 (假设我没有权限在Call方法中写入任何逻辑)

import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class stopThreadTest { public static void main(String[] args) { java.util.concurrent.ExecutorService executor = null; Future a1 = null; try { executor = java.util.concurrent.Executors.newFixedThreadPool(4); a1 = executor.submit(new java.util.concurrent.Callable() { public String call() throws Exception { int i = 0; while (true) { //Thread.sleep(100); // System.out.println("hello"); if (i > 10) break; } return null; } }); // Wait until all threads are finish /* * while (!executor.isTerminated()) { } */ System.out.println("Calling PartialOrFullSuccessCheck"); try { boolean isThreadError = (a1 != null) ? ((a1.get(2, TimeUnit.SECONDS) == null) ? false : true) : false; } catch (TimeoutException e) { // TODO Auto-generated catch block e.printStackTrace(); // interrupts the worker thread if necessary System.out .println("Cancelled" + a1.isDone() + a1.isCancelled()); a1.cancel(true); System.out.println("encountered problem while doing some work"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); // interrupts the worker thread if necessary System.out .println("Cancelled" + a1.isDone() + a1.isCancelled()); a1.cancel(true); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); // interrupts the worker thread if necessary System.out .println("Cancelled" + a1.isDone() + a1.isCancelled()); a1.cancel(true); } } finally { System.out.println("ShutDown Executor"); executor.shutdown(); } } } 

没有合作就没有安全的方法来阻止线程。 线程允许其他线程通过定期检查某些共享变量的值或两者来中断它们来阻止它们。 除此之外,唯一安全的做法是关闭JVM(整个过程)。 这篇文章非常详细:

你如何在Java中杀死一个线程?