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秒後にタスクへの新しい呼び出しをスケジュールしたいと思います。時間。このタイプのスケジューラまたはタスクをどのように作成する必要がありますか?

スケジュールされたthreadpoolexecutorAPIを実行しましたが、このタイプのスケジューラーが見つかりませんでした。

4

6 に答える 6

4

あなたは2つの質問をしています:

1.任意の遅延でタスクをスケジュールするにはどうすればよいですか?

java.util.concurrent.ScheduledThreadPoolExecutorでスケジュール メソッドの1つを使用できます

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

method1が呼び出された時間を記録し、メソッドが30秒前に呼び出されたかどうかを毎秒チェックします。このように、30秒間呼び出しがなかった場合にのみタスクを実行します。

于 2012-09-05T14:43:55.407 に答える
1

コールバックを使用java.util.Timerしてに渡し、TimerTask次の実行をスケジュールします。TimerTaskはcancel、必要に応じてメソッドでキャンセルできます。例えば

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 に答える
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 に答える