我剛注意到以下現象時取消由ForkJoinPool返回的Future。給定以下示例代碼:ForkJoinPool重置線程中斷狀態
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的可加密內部的取消?
順便說一句,你爲什麼在這種情況下使用FJP? – Mikhail
@Mikhail這只是我們用例的一個非常簡單的例子。我們在可調用函數中啓動一些RecursiveActions,並在ForkJoinTask.getPool() – Korbi