使用计时器调度Java线程

时间:2011-03-09 12:10:04

标签: java scheduling executorservice

我有一个Runnable类,需要在自上次运行后设置的时间间隔后运行。 示例:ProcessThread在完成后每2分钟运行一次。因此,如果我在1:00启动ProcessThread,并且需要5分钟(以1:05结束),则下次应该运行时间为1:07。如果那个需要3分钟才能运行(以1:10结束),下一个从1:12开始,依此类推......

我无法以2分钟的固定速率设置它,因为那时第二个线程将被触发而第一个尚未完成。

所以,这是我当前的代码,但是我拥有它的方式,它不断创建线程,永远不会完成它们......所以最终我的记忆力会增长和增长:

主:

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 个答案:

答案 0 :(得分:4)

你可以做到

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

这将创建一个执行程序,在前一个command运行完成后2分钟运行command。查看文档here

以下是它的片段。

  

创建并执行一个周期性操作,该操作在给定的初始延迟之后首先启用,然后在一次执行终止和下一次开始之间给定延迟。如果任务的任何执行遇到异常,则后续执行被禁止。否则,任务将仅通过取消或终止执行者来终止。

考虑关于命令是否有任何异常的最后一句话!

答案 1 :(得分:1)

您可以在MyProcessThread中的finally安排下一次执行。