gpt4 book ai didi

java - ScheduledThreadPoolExecutor,如何停止可运行类JAVA

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:08:16 28 4
gpt4 key购买 nike

我写了下面的代码:

import java.util.Calendar;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

class Voter {
public static void main(String[] args) {
ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(2);
stpe.scheduleAtFixedRate(new Shoot(), 0, 1, TimeUnit.SECONDS);
}
}

class Shoot implements Runnable {
Calendar deadline;
long endTime,currentTime;

public Shoot() {
deadline = Calendar.getInstance();
deadline.set(2011,6,21,12,18,00);
endTime = deadline.getTime().getTime();
}

public void work() {
currentTime = System.currentTimeMillis();

if (currentTime >= endTime) {
System.out.println("Got it!");
func();
}
}

public void run() {
work();
}

public void func() {
// function called when time matches
}
}

我想在调用 func() 时停止 ScheduledThreadPoolExecutor。没有必要让它继续工作!我认为我应该将函数 func() 放在 Voter 类中,而不是创建某种回调。但也许我可以在 Shoot 类中完成。

如何正确解决?

最佳答案

ScheduledThreadPoolExecutor 允许您立即执行您的任务或安排它稍后执行(您也可以设置定期执行)。

因此,如果您要使用此类来停止任务执行,请记住:

  1. 没有办法保证一个线程会停止执行。查看 Thread.interrupt() 文档。
  2. ScheduledThreadPoolExecutor.shutdown() 方法将设置为已取消您的任务,并且它不会尝试中断您的线程。使用这种方法,您实际上可以避免执行较新的任务,以及执行已安排但尚未开始的任务。
  3. ScheduledThreadPoolExecutor.shutdownNow() 方法将中断线程,但正如我在该列表的第一点中所说...

当您想停止调度程序时,您必须执行如下操作:

    //Cancel scheduled but not started task, and avoid new ones
myScheduler.shutdown();

//Wait for the running tasks
myScheduler.awaitTermination(30, TimeUnit.SECONDS);

//Interrupt the threads and shutdown the scheduler
myScheduler.shutdownNow();

但是如果您只需要停止一个任务怎么办?

ScheduledThreadPoolExecutor.schedule(...) 方法返回一个 ScheduleFuture,它代表您已经安排好的任务。因此,您可以调用 ScheduleFuture.cancel(boolean mayInterruptIfRunning) 方法来取消您的任务,并在需要时尝试中断它。

关于java - ScheduledThreadPoolExecutor,如何停止可运行类JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6774816/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com