Я только что заметил следующие явления при отмене Будущего, возвращенного ForkJoinPool. С учетом следующего примера кода: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 игнорирует прерывания, как еще вы должны проверять отмену внутри Callables, отправленных в ForkJoinPool?
BTW, почему вы используете FJP для этого случая? – Mikhail
@ Михайл это всего лишь очень маленький пример нашего прецедента. Мы запускаем некоторые RecursiveActions внутри вызываемого, которые вызываются на ForkJoinTask.getPool() – Korbi