Class A
{
long x;
method1()
{
x = current time in millisecs;
}
task()//want to run this after (x+30) time
}
我需要在(x + 30)之后运行task()。 x可能会有所不同。如果调用了method1,那么任务被安排在30当前时间之后运行,但是如果再次调用method1,则在30个时间段内,我想取消之前的任务调用,并希望在当前30秒后安排对任务的新调用时间。我该如何创建这种类型的调度程序或任务?
通过scheduledthreadpoolexecutor API,但未找到此类调度程序。
答案 0 :(得分:4)
你问了两个问题:
1。如何安排任意延迟的任务?
您可以schedule
使用其中一个methods java.util.concurrent.ScheduledThreadPoolExecutorint delay = System.currentTimeMillis + 30;
myScheduledExecutor.schedule(myTask, delay, TimeUnit.MILLISECONDS);
2。如何取消已经运行的任务?
您可以通过调用schedule
方法返回的cancel上的Future来取消任务。
if (!future.isDone()){
future.cancel(true);
}
future = myScheduledExecutor.schedule(myTask, delay, TimeUnit.MILLISECONDS);
答案 1 :(得分:1)
我会记录time1被调用的时间,我会每秒检查该方法是否在30秒前被调用。这样它只会在没有30秒的通话时执行任务。
答案 2 :(得分:1)
使用java.util.Timer
并将回调传递到TimerTask
以安排下一次运行。如果需要,可以使用cancel
方法取消TimerTask。 e.g。
package test;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTaskDemo {
private Timer timer = new Timer();
private MyTimerTask nextTask = null;
private interface Callback {
public void scheduleNext(long delay);
}
Callback callback = new Callback() {
@Override
public void scheduleNext(long delay) {
nextTask = new MyTimerTask(this);
timer.schedule(nextTask, delay);
}
};
public static class MyTimerTask extends TimerTask {
Callback callback;
public MyTimerTask(Callback callback) {
this.callback = callback;
}
@Override
public void run() {
// You task code
int delay = 1000;
callback.scheduleNext(delay);
};
}
public void start() {
nextTask = new MyTimerTask(callback);
timer.schedule(nextTask, 1000);
}
public static void main(String[] args) {
new TimerTaskDemo().start();
}
}
答案 3 :(得分:0)
为什么不使用JDK的Timer类来建模您的需求。根据您的要求,您将根据需要在计时器中安排任务。
答案 4 :(得分:0)
我认为最简单的方法就是满足您的需求。类B
是调用类。
class A {
public void runAfterDelay(long timeToWait) throws InterruptedException {
Thread.sleep(timeToWait);
task();
}
}
class B {
public static void main(String[] args) throws InterruptedException {
A a = new A();
// run after 30 seconds
a.runAfterDelay(30000);
}
}
答案 5 :(得分:-1)
Class A
{
$x;
function method1()
{
$time = microtime(true);
}
sleep($time + 30);
task()//want to run this after (x+30) time
}