如何在变化的时间后执行任务

时间:2012-09-05 14:36:39

标签: java multithreading

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,但未找到此类调度程序。

6 个答案:

答案 0 :(得分:4)

你问了两个问题:

1。如何安排任意延迟的任务?

您可以schedule

使用其中一个methods java.util.concurrent.ScheduledThreadPoolExecutor
int 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
}