定时线程池如何停止定时任务,定时线程池如何实现?
00-1010 1.附表2。ScheduleatFixedRate 3。SchedulewithFixedDelay汇总前言:
在Java语言中,可以执行调度任务的线程池有两个:ScheduledThreadPool和singlethreadschedulexecutor,其中singlethreadschedulexecutor可以看作是ScheduledThreadPool的单线程版本。其用法与ScheduledThreadPool相同,因此本文重点介绍ScheduledThreadPool的使用。
ScheduledThreadPool 执行定时任务的方法有以下 3 个:
使用schedule方法执行计划任务,并且只执行一次计划任务。使用scheduleAtFixedRate方法执行计划任务,并多次执行计划任务。使用scheduleWithFixedDelay方法执行计划任务,并多次执行计划任务。接下来,我们来看看这三种方法的具体用法和区别。
目录
schedule 方法只能执行一次定时任务,它需要传递 3 个参数:
第 1 个参数:传递一个任务,可运行或可调用的对象;第 2 个参数:增加一个预定任务后,多长时间开始执行预定任务;第 3 个参数:时间单位,与参数2一起使用。下面我们创建一个 3 秒以后执行的定时任务:
导入Java . time . local datetime;导入Java . util . concurrent . executors;import Java . util . concurrent . scheduledexecutorservice;导入Java . util . concurrent . time unit;public类ScheduledThreadPoolExample { public static void main(String[]args)throws interrupted exception {//创建一个ScheduledThreadPool线程池scheduledexecutorservice线程池=executors . newschedthreadpool(10);System.out.println(schedule方法添加一个任务: local datetime . now());thread pool . schedule(newrunnable(){ @ override public void run(){ system . out . println( execute schedule method: local datetime . now()));} },3,时间单位。秒);//3s后执行//下面的代码是给业务方法一个时间比较信息TimeUnit。SECONDS.sleep(十);//Hibernate 10s system . out . println(当前时间: local datetime . now());} }以上程序的执行结果如下图所示:
从上面的结果可以看出,使用调度方法只能执行一次调度任务。
1.schedule
scheduleAtFixedRate 方法可以执行多次定时任务,此方法需要 4 个参数:
第一个参数:传递一个任务,Runnable或者Callable对象;第二个参数:添加预定任务后,多长时间开始执行预定任务;第三个参数:调度任务执行的时间间隔;第四个参数:时间单位,与参数2和参数3一起使用。我们来创建一个3秒后执行的定时任务,每个定时任务的时间间隔是2秒。
实现代码如下:
导入Java . time . local datetime;导入Java . util . concurrent . executors;导入Java . util . concurrent . scheduledexecutorservi
ce;import java.util.concurrent.TimeUnit;public class ScheduledThreadPoolExample { public static void main(String[] args) throws InterruptedException { // 创建 ScheduledThreadPool 线程池 ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10); System.out.println("scheduleAtFixedRate 方法添加任务:" + LocalDateTime.now()); threadPool.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("执行 scheduleAtFixedRate 方法:" + LocalDateTime.now()); // 休眠 2s try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } }, 3L, // 3s 后开始执行定时任务 2L, // 定时任务的执行间隔为 2s TimeUnit.SECONDS); // 描述上面两个参数的时间单位 }}以上程序的执行结果如下图所示:
从上述结果可以看出,当任务添加成功之后,3s 后开始执行第一个定时任务,之后每隔 2s 执行一次定时任务。
3.scheduleWithFixedDelay
scheduleWithFixedDelay 方法的使用和 scheduleAtFixedRate 类似,但执行效果完全不同,这个很容易理解如果效果一样就不用创建两个方法了。scheduleWithFixedDelay 方法是在方法执行完成之后,再隔 N 秒执行下一个定时任务,和 scheduleAtFixedRate 的固定时间执行不同,scheduleWithFixedDelay 方法的执行受定时任务执行的时长影响,
比如以下代码:
import java.time.LocalDateTime;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class ScheduledThreadPoolExample { public static void main(String[] args) throws InterruptedException { // 创建 ScheduledThreadPool 线程池 ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10); System.out.println("scheduleWithFixedDelay 方法添加任务:" + LocalDateTime.now()); threadPool.scheduleWithFixedDelay(new Runnable() { @Override public void run() { System.out.println("执行 scheduleWithFixedDelay 方法:" + LocalDateTime.now()); // 休眠 2s try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } }, 3L, // 3s 后开始执行定时任务 2L, // 定时任务执行完 2s 之后,再执行下一个定时任务 TimeUnit.SECONDS); // 描述上面两个参数的时间单位 }}
以上程序的执行结果如下图所示:
从上述结果可以看出,定时任务在 3s 之后开始执行,以后每隔 4s 执行一次,这 4s 包含了,定时任务执行花费的 2s,加上每隔 2s 执行一次的时间间隔,也就是说scheduleWithFixedDelay 是在任务执行完 N 秒之后,再执行下一次定时任务。
总结
线程池执行定时任务的实现方法有 3 个:
使用 schedule 方法执行定时任务,只执行一次定时任务。使用 scheduleAtFixedRate 方法执行定时任务,执行多次定时任务,它的执行时间间隔是固定的,不受定时任务执行时长影响(定时任务时间间隔 > 任务执行时间)。使用 scheduleWithFixedDelay 方法执行定时任务,执行多次定时任务,它是在定时任务执行完之后,再隔 N 秒开始执行下一次定时任务,它的执行时间受定时任务执行时长影响。到此这篇关于Java使用线程池执行定时任务的文章就介绍到这了,更多相关Java行定时任务内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。