我有一个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中运行之前,它的结果是相同的。这看起来是正确的方向,但仍有问题。
答案 0 :(得分:4)
你可以做到
scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleWithFixedDelay(command, 0, 2, TimeUnit.MINUTES);
这将创建一个执行程序,在前一个command
运行完成后2分钟运行command
。查看文档here。
以下是它的片段。
创建并执行一个周期性操作,该操作在给定的初始延迟之后首先启用,然后在一次执行终止和下一次开始之间给定延迟。如果任务的任何执行遇到异常,则后续执行被禁止。否则,任务将仅通过取消或终止执行者来终止。
考虑关于命令是否有任何异常的最后一句话!
答案 1 :(得分:1)
您可以在MyProcessThread中的finally
安排下一次执行。