Java 如何在改变时间后执行任务

Java 如何在改变时间后执行任务,java,multithreading,Java,Multithreading,我需要在(x+30)之后运行task()。x可能是变化的。如果调用method1,则任务计划在当前时间30秒后运行,但如果再次调用method1,则我希望取消上一个任务调用,并希望在当前时间30秒后计划对任务的新调用。如何创建此类型的计划程序或任务 已检查scheduledthreadpoolexecutor API,但未找到此类型的计划程序 我会记录调用method1的时间,并每秒检查该方法是否在30秒前被调用。这样,它只会在30秒内没有调用时执行任务。为什么不使用JDK类对需求建模呢。根据您

我需要在(x+30)之后运行task()。x可能是变化的。如果调用method1,则任务计划在当前时间30秒后运行,但如果再次调用method1,则我希望取消上一个任务调用,并希望在当前时间30秒后计划对任务的新调用。如何创建此类型的计划程序或任务


已检查scheduledthreadpoolexecutor API,但未找到此类型的计划程序

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

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

您将提出两个问题:

Class A 
{
 long x;
 method1()
  {
   x = current time in millisecs;
  }
 task()//want to run this after (x+30) time
}
一,。如何安排具有任意延迟的任务

您可以在上使用其中一个

二,。如何取消已在运行的任务

通过调用从调用的
schedule
方法返回的来取消任务

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

我认为做你需要的事情最简单的方法是以下几点。Class
B
是调用类

if (!future.isDone()){
    future.cancel(true);
}
future = myScheduledExecutor.schedule(myTask, delay, TimeUnit.MILLISECONDS);

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

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);
    }
}

这是WTF吗?当然不是Java-1我认为这是一个定期任务,检查是否设置了某个变量(意味着调用了method1),并基于此重新安排要执行的任务()或取消该任务。这是像每秒检查一样的唯一方法吗?如果大约每秒钟都有线程切换,CPU每秒可以切换10000次上下文,这难道不是一种开销吗。每秒钟检查一次并没有那么多。您可以创建一个将来,每次调用method1()时都会取消它。这有一个问题,即开销与调用method1()的次数成正比。参见serg10的示例。通过投票,成本是固定的,如果你开始这样做时一切正常,你知道它永远不会变得更糟该死,已经6年了,但这个解决方案是最好的!
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);
    }
}
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();
    }
}