Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计划任务以可变时间间隔运行_Java_Multithreading - Fatal编程技术网

Java 计划任务以可变时间间隔运行

Java 计划任务以可变时间间隔运行,java,multithreading,Java,Multithreading,我是Java新手,基本上,我必须启动一个线程并以默认时间间隔运行它,比如100秒(来自变量冷却时间)。此冷却时间可以更新任意次数。假设冷却时间更改为10秒,现在线程应该以10秒的间隔运行。我应该使用什么以及如何实现这一点?我研究了一些选项,如ScheduledExecutorService,但它需要一个时间间隔,在我的例子中,这个时间间隔是不固定的。举个小例子会很有帮助。谢谢 将逻辑封装在类中,并使用一个设置间隔的方法。调用该方法时,将取消当前计划任务并启动新任务。它可以看起来像这样: priv

我是Java新手,基本上,我必须启动一个线程并以默认时间间隔运行它,比如100秒(来自变量
冷却时间
)。此冷却时间可以更新任意次数。假设冷却时间更改为10秒,现在线程应该以10秒的间隔运行。我应该使用什么以及如何实现这一点?我研究了一些选项,如
ScheduledExecutorService
,但它需要一个时间间隔,在我的例子中,这个时间间隔是不固定的。举个小例子会很有帮助。谢谢

将逻辑封装在类中,并使用一个设置间隔的方法。调用该方法时,将取消当前计划任务并启动新任务。它可以看起来像这样:

private ScheduledExecutorService executorService = ...
private ScheduledFuture<T> future = null;

public void setCoolDown(int cooldownSec) {
    scheduleCoolDown(cooldownSec);
}

private synchronized void scheduleCoolDown(int interval) {
   if (future != null || !future.isDone()) {
        future.cancel();
   }
   future = executorService.scheduleAtFixedRate(theRunnable, interval, 0, TimeUnit.SECONDS);
}
private ScheduledExecutorService executorService=。。。
private ScheduledFuture future=null;
公共无效设置冷却时间(int冷却时间秒){
计划冷却时间(冷却时间秒);
}
专用同步无效计划冷却(int间隔){
if(future!=null | |!future.isDone()){
future.cancel();
}
future=executorService.scheduleAtFixedRate(TheRunName,interval,0,TimeUnit.SECONDS);
}

synchronized
用于确保同一时间只有一个线程可以重新调度

以下是如何使用
TimerTask
完成此任务:

private volatile int cooldown = 100;
private Timer timer = new Timer();

private class MyTask extends TimerTask {
    @Override
    public void run() {
        // do work
        timer.schedule(new MyTask(), cooldown * 1000);
    }
}

private void startSchedule() {
    new MyTask().run();
}

public void setCooldown(int cooldown) {
    this.cooldown = cooldown;
}

好吧,说真的,想解释一下否决票吗?正如我提到的,我是Java的新手,需要一些指导。这是否意味着只有专家才需要这样做?冷却更新需要立即生效,还是在下次运行后生效?