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 内のキャンセルをチェックするには、他にどのような方法がありますか?