Как полностью остановить / прекратить задачу, которая уже была отправлена ​​в ExecutorService в Java? - PullRequest
0 голосов
/ 24 марта 2020

Проблема: у меня есть сценарий использования, в котором я хочу отменить задачу, которая уже была передана в службу исполнителя. future.cancel () мне не помогает, так как задача не go в состоянии wait () / sleep () во время выполнения. Кроме того, добавление isInterrupted() не масштабируется по следующим причинам:

  1. Многие другие сервисы вызываются во время выполнения и используют isInterrupted() перед каждым вызовом безобразно.
  2. Если Предположим, что один из вызовов службы в одной из представленных задач занимает больше 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
...