ScheduledExcutorService

public interface ScheduledExecutorService extends ExecutorService

  • scheduleAtFixedRate固定频率
  • scheduleWithFixedDelay固定间隔

提交执行:Executor.execute(Runnable)ExecutorService 的submit,默认立即执行

日期与间隔间转化:

schedule(task, date.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 一小时内,10秒后开始,每隔10秒响一次 
import static java.util.concurrent.TimeUnit.*;
class BeeperControl {
private final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);

public void beepForAnHour() {
final Runnable beeper = new Runnable() {
public void run() { System.out.println("beep"); }
};
final ScheduledFuture<?> beeperHandle =
scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
scheduler.schedule(new Runnable() {
public void run() { beeperHandle.cancel(true); }
}, 60 * 60, SECONDS);
}
}

与Timer区别是:

Timer内部只有一个线程,若崩溃则整个任务崩溃。

ScheduledExcutorService可以利用线程池保证持续运行。且在多个任务并行时,线程池方案更加高效。

参考资料

Interface ScheduledExecutorService

ScheduledExecutorService的简单使用

面试总结(6):ScheduledExecutorService的使用