首页 > 编程语言 > 详细

ScheduledExecutorService 多线程,单线程的影响,定时任务,延时任务,周期任务

时间:2020-11-03 20:49:14      阅读:32      评论:0      收藏:0      [点我收藏+]
adfa

1.schedule()方法

public static void main(String[] args) {
// 注意此处线程个数为1
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
long start = System.currentTimeMillis();
System.out.println("第一次提交");
executorService.schedule(()->{
System.out.println(System.currentTimeMillis() - start);
try {
// 注意此处休眠4秒
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, 3, TimeUnit.SECONDS);
System.out.println("第二次提交");
executorService.schedule(()->{
System.out.println(System.currentTimeMillis() - start);
}, 3, TimeUnit.SECONDS);
}

总结:
该还输有延时的作用,多次提交任务时,后面任务延时是否准确,与线程池的大小和上一个任务执行耗时时两个因素有关;提交任务的先后顺序与实际执行无关,与延迟时间有关


2.scheduleAtFixedRate()方法


public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleAtFixedRate(()->{
System.out.println("coming");
try {
// 注意此处休眠时间为2s
Thread.sleep(2000);
System.out.println("sleep end");
} catch (InterruptedException e) {
e.printStackTrace();
}
// 延迟0s执行,周期为3s
}, 0, 3, TimeUnit.SECONDS);

结论:此方法是周期性方法,周期性执行任务,当任务消耗时长长于周期,那么下一个任务将在上一个任务结束后马上执行,当任务消耗时长短于周期,按照周期执行。


3.scheduleWithFixedDelay()方法
public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleWithFixedDelay(()->{
System.out.println("coming");
try {
// 注意此处休眠时间为2s
Thread.sleep(2000);
System.out.println("sleep end");
} catch (InterruptedException e) {
e.printStackTrace();
}
// 第一个任务延迟0s执行,其余延迟为3s
}, 0, 3, TimeUnit.SECONDS);
}

结论:此方法用于周期性执行,无论上一个方法耗时多长,下一个方法都会等到上一个方法执行完毕后,再delay到时间才执行。



 

ScheduledExecutorService 多线程,单线程的影响,定时任务,延时任务,周期任务

原文:https://www.cnblogs.com/lalalazar/p/13922196.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!