Проблема: у меня есть сценарий использования, в котором я хочу отменить задачу, которая уже была передана в службу исполнителя. future.cancel () мне не помогает, так как задача не go в состоянии wait () / sleep () во время выполнения. Кроме того, добавление isInterrupted()
не масштабируется по следующим причинам:
- Многие другие сервисы вызываются во время выполнения и используют
isInterrupted()
перед каждым вызовом безобразно. - Если Предположим, что один из вызовов службы в одной из представленных задач занимает больше X миллисекунд. Я хотел бы прервать задачу и освободить шаг.
Вот пример кода, который я использую future.cancel () прямо сейчас. Есть ли способ, где я могу полностью прервать отправленную задачу / уничтожить поток, выполняющий задачу в функции main (), не мешая другим отправленным задачам.
public class Main {
ExecutorService executorService = newFixedThreadPool(10);
public static void main(String[] args) {
Future<Integer> test = new Main().sample();
try {
test.get(0, java.util.concurrent.TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
System.out.println("Throwing InterruptedException");
} catch (java.util.concurrent.ExecutionException e) {
System.out.println("Throwing ExecutionException");
} catch (java.util.concurrent.TimeoutException e) {
System.out.println("Throwing TimeoutException");
} finally {
System.out.println(test.cancel(true));
}
System.out.println("main() COMPLETED");
}
private Future<Integer> sample() {
return executorService.submit(() -> {
System.out.println("sample() STARTED");
anotherSample();
System.out.println("sample() COMPLETED");
return 1;
});
}
private void anotherSample() throws Exception {
System.out.println("anotherSample() STARTED");
for (int i = 0; i < 100000; i++) {
// do nothing
}
System.out.println("anotherSample() COMPLETED");
}
}
Вывод:
Throwing TimeoutException
sample() STARTED
anotherSample() STARTED
true
main() COMPLETED
anotherSample() COMPLETED
sample() COMPLETED