Как остановить весь запускаемый поток в классе Java executor?

final ExecutorService executor = Executors.newFixedThreadPool(1);
final Future<?> future = executor.submit(myRunnable);
executor.shutdown();
if(executor.awaitTermination(10, TimeUnit.SECONDS)) {
  System.out.println("task completed");
}else{
  System.out.println("Executor is shutdown now");
}

//MyRunnable method is defined as task which I want to execute in a different thread.

здесь run метод класса исполнитель:

public void run() {
try {
     Thread.sleep(20 * 1000);
} catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
}}

вот он ждет 20 второй, но когда я запускаю код, он выдает исключение:

java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)

Я не могу закрыть параллельный поток, разрушающий Java Executor class. Вот мой код:

  • создал новый поток с классом Java executor для выполнения некоторой задачи i.e написано MyRunnable
  • executor подождите 10 секунд, чтобы завершить задачи.
  • если задача завершена, то запускаемый поток также был завершен.
  • если задача не будет выполнена в течение 10 секунд, то executor класс должен завершить поток.

все работает нормально, за исключением завершения задач в последнем сценарии. Как мне это сделать?

2 ответов


на shutDown() метод просто предотвращает планирование дополнительных задач. Вместо этого вы можете позвонить shutDownNow() и проверьте прерывание потока в вашем Runnable.

// in your Runnable...
if (Thread.interrupted()) {
  // Executor has probably asked us to stop
}

пример, основанный на вашем коде, может быть:

final ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
  public void run() {
    try {
      Thread.sleep(20 * 1000);
    } catch (InterruptedException e) {
      System.out.println("Interrupted, so exiting.");
    }
  }
});

if (executor.awaitTermination(10, TimeUnit.SECONDS)) {
  System.out.println("task completed");
} else {
  System.out.println("Forcing shutdown...");
  executor.shutdownNow();
}

как правило, плохая идея завершить запущенный поток извне, потому что вы не знаете, в каком состоянии поток находится в настоящее время. Возможно, что ему нужно сделать некоторые очистки, и он не сможет этого сделать, когда вы принудительно отключите его. вот почему все методы ниток, которые помечены как deprecated.

гораздо лучше использовать один из многих методов, которые доступны для межпроцессной связи, чтобы сигнализировать процедуру запуск в самом потоке, что он должен прервать свою работу и выйти нормально. Один из способов сделать это-добавить abort() метод для вашего runnable, который поднимает флаг, объявленный как volatile. Внутренний цикл вашего Runnable проверяет этот флаг и выходит (контролируемым образом), когда этот флаг поднят.