9

我写了以下代码:

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 类中做到这一点。

我怎样才能正确解决它?

4

1 回答 1

21

允许您立即执行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)方法来取消您的任务,并在需要时尝试中断它。

于 2011-08-03T14:24:34.427 回答