Планирование потоков Java с таймером - PullRequest
2 голосов
/ 09 марта 2011

У меня есть класс Runnable, который должен запускаться через заданный интервал с момента его последнего запуска. Пример: ProcessThread запускается каждые 2 минуты после завершения. Так что, если я запускаю ProcessThread в 1:00, а это занимает 5 минут (заканчивается в 1:05), в следующий раз он будет запущен в 1:07. Если для этого требуется 3 минуты (до 1:10), то начинается с 1:12) и т. Д.

Я не могу установить его с фиксированной скоростью 2 минуты, потому что тогда будет запущен второй поток, а первый еще не закончен.

Итак, вот мой текущий код, но, как он у меня есть, он продолжает создавать потоки и никогда не заканчивает их ... так что со временем моя память растет и растет:

Main:

public class MyMain extends Thread{
   public static void main(String[] args)  {        

    ExecuteThread execute = new ExecuteThread();
    execute.start();
   }
}

ExecuteThread (я вынул try-catch):

public void run() {

      MyProcessThread myProcess = new MyProcessThread();
      ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

      myProcess.start();
      while(myProcess.isAlive()){
         sleep(10000);
      }

      scheduler.schedule(this,myProcess.getDelaySeconds(),TimeUnit.SECONDS);

}

Прежде чем я запустил планировщик внутри MyProcessThread, но это привело к тому же. Это выглядит как правильное направление, но что-то все еще не так.

Ответы [ 2 ]

4 голосов
/ 09 марта 2011

Вы можете сделать

scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleWithFixedDelay(command, 0, 2, TimeUnit.MINUTES);

Это создаст исполнителя, который будет запускаться command через 2 минуты после завершения предыдущего запуска command. Проверьте документацию здесь .

Вот фрагмент кода.

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

Примите во внимание последнее предложение о том, есть ли исключение из команды!

1 голос
/ 09 марта 2011

Вы можете запланировать следующее выполнение в finally в MyProcessThread.

...