Почему я не могу отменить мою работу с исполнителем? - PullRequest
3 голосов
/ 24 сентября 2019

Я безуспешно пытаюсь отменить поток, отправленный с этим кодом

  ExecutorService executor = Executors.newSingleThreadExecutor();
  Future<Object> future = executor.submit(()-> {while(true) { System.out.println("Thread"); Thread.yield();} } );
  Thread.sleep(3000);
  future.cancel(true);
  executor.shutdown();

, но поток продолжает работать.Если вместо yield используется sleep, поток действительно отменяется.Например, это отменяет тему:

  ExecutorService executor = Executors.newSingleThreadExecutor();
  Future<Object> future = executor.submit(()-> {while(true) { System.out.println("Thread"); Thread.sleep(1000);} } );
  Thread.sleep(3000);
  future.cancel(true);
  executor.shutdown();

Что происходит?Я что-то упустил в документации?

Ответы [ 2 ]

4 голосов
/ 24 сентября 2019

Ваша первая задача НЕ реагирует на прерывание.Но вторая задача отзывчива, потому что Thread.sleep - это метод блокировки, который реагирует на прерывание.Один из способов решения этой проблемы - сделать вашу задачу реагирующей на прерывание.Вот как это выглядит.

Future<?> future = executor.submit(() -> {
    while (!Thread.currentThread().isInterrupted())
        System.out.println("Thread");
});

Более того, Thread.yield - это всего лишь подсказка планировщика, позволяющая использовать его текущее использование процессора.Эта операция зависит от платформы и не должна использоваться на практике.Поэтому я удалил это из своего ответа.

0 голосов
/ 24 сентября 2019

Если вы намерены остановить все отправленные задачи, вы можете использовать

executor.shutdownNow();

Попытки остановить все активно выполняемые задачи, остановить обработку ожидающих задач и вернуть список задач, которыеожидали исполнения.

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#shutdownNow()


Как уже упоминалось в разделе комментариев вопроса, это разница между поведением .sleep(1000) и .yield() дляпрерывание вызовов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...