【发布时间】:2014-02-14 17:00:03
【问题描述】:
我刚刚在取消ForkJoinPool 返回的Future 时注意到以下现象。给定以下示例代码:
ForkJoinPool pool = new ForkJoinPool();
Future<?> fut = pool.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
while (true) {
if (Thread.currentThread().isInterrupted()) { // <-- never true
System.out.println("interrupted");
throw new InterruptedException();
}
}
}
});
Thread.sleep(1000);
System.out.println("cancel");
fut.cancel(true);
程序从不打印interrupted。 ForkJoinTask#cancel(boolean) 的文档说:
mayInterruptIfRunning - 此值在默认实现中无效,因为中断不用于控制取消。
如果 ForkJoinTasks 忽略中断,您还应该如何检查提交到 ForkJoinPool 的 Callables 中的取消?
【问题讨论】:
-
顺便说一句,你为什么在这种情况下使用 FJP?
-
@Mikhail 这只是我们用例的一个非常小的示例。我们在 ForkJoinTask.getPool() 上调用的可调用对象中启动了一些 RecursiveActions
标签: java multithreading java.util.concurrent forkjoinpool