Java中的计划任务Timer工具类提供了以计时器或计划任务的功能来实现按指定时间或时间间隔执行任务,但由于Timer工具类并不是以池pool,而是以队列的方式来管理线程的,所以在高并发的情况下运行效率较低,在新版JDK中提供了ScheduledExecutorService对象来解决效率与定时任务的功能。
==============ScheduledThreadPoolExecutor使用Callable延迟运行=================
这个设置的延迟秒数是指的在线程池初始化后等待秒数。
如果有线程a和b,都设置了延迟时间,不是说a在延迟5秒后,开始执行,执行完毕之后,在延迟四秒去执行b
而是线程池初始完毕后,开始计时,延后四秒后,开始执行a,在过一秒也就是延迟时间达到5秒时,再开始执行b。
注意:
如果是单一线程池,因为线程池中只能有一个线程在执行,所以会出现等待现象,也就是b在延迟四秒后开始执行,到达5秒的时候,按规则来说,a也该开始执行,但是如果恰好b线程未执行完毕,那么a会等待b线程执行完毕,再开始执行。
=======================scheduleAtFixedRate()方法实现周期性执行===================
scheduleAtFixedRate(new MyRunnale(),1,3,TimeUnit.SECONDS);
参数说明:
new MyRunnale() ------线程对象
1-----第一次执行的延迟时间
3-----执行的间隔时间
TimeUnit.SECONDS-----时间单位
注意:
1、scheduleAtFixedRate()方法返回的Scheduled-Future对象无法获得返回值,也就是scheduleAtFixedRate()方法不具有获得返回值的功能
2、如果线程执行时间大于等于设置的间隔周期,则设置的间隔将失效。
3、间隔时间是在线程开始算,不是说等上一次线程执行完毕,在等待间隔时间后执行。
示例:执行时间大于间隔时间
结合2图,线程执行时间为4秒,设置间隔时间为3秒。可以看出,线程两次执行没有间隔。
我们把线程执行的时间改为2秒,在执行会发现,我们设置间隔为3秒,而执行时间为2秒,则会看到下一次线程执行是在第一次执行完毕后1秒开始执行。也就是在第一次线程开始后,等待了3秒开始执行。