0

У меня есть ScheduledThreadPoolExecutor, который имеет один поток и работает каждые 30 секунд.Как остановить следующий поток от запуска в ScheduledThreadPoolExecutor

Теперь, если текущий исполняемый поток генерирует какое-то исключение, тогда мне нужно убедиться, что следующий поток не запущен, а ScheduledThreadPoolExecutor не работает.

Как это достичь?

+1

Хм ... Просто поймать исключение и выключение ИСПОЛНИТЕЛЬ из сточного-блока. – kan

ответ

1

Как чистый способ, вы можете просто использовать статический доступный класс для установки/проверки доступности выполнения.

import java.util.concurrent.atomic.AtomicBoolean; 

class ThreadManager 
{ 
    private static AtomicBoolean shouldStop = new AtomicBoolean(false); 

    public static void setExceptionThrown(boolean val) 
    { 
     shouldStop.set(val); 
    } 

    public boolean shouldExecuteTask() 
    { 
     return !shouldStop.get(); 
    } 
} 

И обычаем работоспособная реализация, которая позволяет проверить возможность выполнения задачи

abstract class ModdedRunnable implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     if(ThreadManager.shouldExecuteTask()) 
     { 
      try 
      { 
       runImpl(); 
      } 
      catch(Exception t) 
      { 
       ThreadManager.setExceptionThrown(true); 
      } 
     } 
    } 

    public abstract void runImpl() throws Exception; 
} 
1

поймать выключение вызова исключения/shutdownNow API в ExecutorService

отключения()

Инициирует упорядоченное закрытие, в котором ранее отправлялись выполняются, но новые задачи не будут приняты. Вызов не имеет дополнительного эффекта, если он уже выключен. Этот метод не ожидает выполнения ранее поставленных задач для завершения выполнения. Используйте awaitTermination, чтобы сделать это.

shutdownNow()

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

Нет гарантий, кроме попыток прекратить обработку, активно выполняющих задачи. Например, типичные реализации будут отменены через Thread.interrupt(), поэтому любая задача, которая не отвечает на прерывания, может никогда не прекратиться.

Обратитесь к этому сообщению для получения более подробной информации с рабочим кодом.

How to forcefully shutdown java ExecutorService

 Смежные вопросы

  • Нет связанных вопросов^_^