在取消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 中的取消?