您能想到为什么这段代码不起作用并且总是输出“完成”,但第二个示例可以正常工作的任何原因吗?我正在使用最新的 JDK (8u45)。
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);
}
}
下面的例子可以完美地工作:
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);
}
}
编辑:添加返回和更新的睡眠时间和另一个示例。
这比我最初想象的要简单。问题是work-stealing-pool在内部使用ForkJoinPool,而ForkJoinTask不支持cancel(true),因此在任务启动后不可能取消任务。
请参阅 javadoc 文档(http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinTask.html http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinTask.html):
mayInterruptIfRunning - this value has no effect in the default implementation
because interrupts are not used to control cancellation.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)