ExecutorService workStealingPool and cancel method
您能想到为什么这个代码不能工作并且总是输出"finished"的任何原因吗?但是第二个示例工作时没有任何问题。我正在使用最新的JDK(8U45)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public static class MyClass implements Runnable { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException ex) { System.out.println("Interrupted"); return; } System.out.println("Finished"); } public static void main(String[] args) { // spot the difference -> ExecutorService executorService = Executors.newWorkStealingPool(4); Future future = executorService.submit(new MyClass()); Thread.sleep(100); future.cancel(true); } } |
下面的例子完美无瑕:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public static class MyClass implements Runnable { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException ex) { System.out.println("Interrupted"); return; } System.out.println("Finished"); } public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); Future future = executorService.submit(new MyClass()); Thread.sleep(100); future.cancel(true); } } |
号
编辑:增加了返回和更新的睡眠时间和另一个例子。
比我原来想象的简单。问题是窃取工作池在内部使用了ForkJoinPool,ForkJoinTask不支持Cancel(true),因此无法在任务启动后取消任务。
请参见参考资料文档(HTTP文件):
1 2 | mayInterruptIfRunning - this value has no effect in the default implementation because interrupts are not used to control cancellation. |
没有办法强制终止Java中的线程。(二十年前,Java 1试图提供这一点,结果证明它是不可行的;试图去做的方法被拒绝了,没有替换。)
作为runnable的作者,您负责通过干净地终止自己的