3
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 秒后运行,但在 30 时间段内,如果再次调用 method1,则我想取消上一个任务调用,并希望在当前时间 30 秒后安排对任务的新调用时间。我应该如何创建这种类型的调度程序或任务?

通过 schedulethreadpoolexecutor API 但没有找到这种类型的调度程序。

4

6 回答 6

4

你问了2个问题:

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

您可以在java.util.concurrent.ScheduledThreadPoolExecutor上使用其中一种调度 方法

int delay = System.currentTimeMillis + 30;
myScheduledExecutor.schedule(myTask, delay, TimeUnit.MILLISECONDS);

2. 如何取消已经运行的任务?

您可以通过调用从您调用的方法返回的Future上的cancel来取消任务。schedule

if (!future.isDone()){
    future.cancel(true);
}
future = myScheduledExecutor.schedule(myTask, delay, TimeUnit.MILLISECONDS);
于 2012-09-05T14:56:58.273 回答
1

使用java.util.Timer并将回调传递给TimerTask以安排下一次运行。cancel如果需要,可以使用方法取消 TimerTask 。例如

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();
    }
}
于 2012-09-05T15:37:34.043 回答
1

我会记录调用 method1 的时间,并且我会每秒检查一次该方法是否在 30 秒前被调用。这样它只会在 30 秒内没有呼叫时执行任务。

于 2012-09-05T14:43:55.407 回答
0

为什么不使用 JDK 的Timer类对您的需求进行建模。根据您的要求,您将根据需要在计时器中安排任务。

于 2012-09-05T14:46:07.900 回答
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);
    }
}
于 2012-09-05T15:03:28.983 回答
-1
Class A 
{
 $x;
 function method1()
  {
   $time = microtime(true);
  }
 sleep($time + 30);
 task()//want to run this after (x+30) time
}
于 2012-09-05T14:48:01.713 回答