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