问题
ScheduledExecutorService
接口是什么
答案
ScheduledExecutorService接口
- schedule方法
ScheduledExecutorService
用于延迟一段时间后执行任务或者周期性的执行任务.通常使用Executor
类的工厂方法去实例化一个ScheduledExecutorService
是一个比较好的方式.
这里我们创建一个带有一个线程的ScheduledExecutorService
.
ScheduledExecutorService executorService =Executors.newSingleThreadScheduledExecutor();
为了延迟一段时间后执行任务,使用ScheduledExecutorService
接口的scheduled()
方法,这个接口提供了两个方法,用于执行Runnable
任务或者Callable
任务.
Callable<String> callableTask = () -> {
System.out.println("callAble");
return "callAble";
};
Runnable runnableTask = () -> {
System.out.println("runnable");
};
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.schedule(callableTask,3,TimeUnit.SECONDS);
executorService.schedule(runnableTask,3,TimeUnit.SECONDS);
上面的代码延迟了3秒后再执行任务.
- scheduleAtFixedRate方法
scheduleAtFixedRate()
方法在延迟一段时间之后周期性的执行一个任务.下面的代码将会先延迟1秒之后首次执行,之后每隔3秒执行.如果所需要执行的时间大于我们指定的时间,那将会在执行时间过后立即执行.
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(runnableTask,1,3,TimeUnit.SECONDS);
- scheduleWithFixedDelay方法
如果需要任务周期性执行的时候保持固定的时间间隔,应该使用scheduleWithFixedDalay()
方法.如下的代码保证上一次任务执行完过10秒之后再执行下一次任务.
executorService.scheduleWithFixedDelay(runnableTask,1,10,TimeUnit.SECONDS);
scheduleAtFixedRate()
方法和scheduleWithFixedDelay()
方法约定:如果ExecutorService
被关闭,或者在任务执行过程中抛出了一个异常,那么周期性执行的任务将会终止.