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