原文作者:szlcy
原文地址:jdk 1.8 之 ScheduledThreadPoolExecutor 定时任务的退出和取消
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49package com.dosrain.shunc.trial.schedule; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.concurrent.*; public class PoolTest2 { public static void main(String[] args) { // 设置一个同步计算数,目的是让子线程完成工作后,主线程再继续工作。 // 因为这里只有一个子线程,所以设值为 1 CountDownLatch countDownLatch = new CountDownLatch(1); // 创建线程池 ScheduledThreadPoolExecutor pool = new ScheduledThreadPoolExecutor(1); // 创建固定时延的定时任务 ScheduledFuture<?> scheduledFuture = pool.scheduleWithFixedDelay( new Task2(countDownLatch, 10) , 0 , 2, TimeUnit.SECONDS); try { // 暂停主线程,等待同步计算数器归零后,主线程再继续工作 countDownLatch.await(); // 同步计数器已归零,说明定时任务已满足条件退出 // 所以取消定时任务 scheduledFuture.cancel(true); } catch (InterruptedException e) { e.printStackTrace(); } // 关闭线程池 pool.shutdown(); } } class Task2 implements Runnable { CountDownLatch countDownLatch; private int counter; public Task2(CountDownLatch countDownLatch, int counter) { this.countDownLatch = countDownLatch; this.counter = counter; } @Override public void run() { LocalDateTime localDateTime = LocalDateTime.now(); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 处理一些任务 System.out.println(localDateTime.format(dtf) + " [" + Thread.currentThread().getName() + "] " + counter); if (counter-- == 0) { // 判断达到停止任务的条件 countDownLatch.countDown(); } } }
程序执行结果:
2020-07-13 15:37:54 [pool-1-thread-1] 10
2020-07-13 15:37:56 [pool-1-thread-1] 9
2020-07-13 15:37:58 [pool-1-thread-1] 8
2020-07-13 15:38:00 [pool-1-thread-1] 7
2020-07-13 15:38:02 [pool-1-thread-1] 6
2020-07-13 15:38:04 [pool-1-thread-1] 5
2020-07-13 15:38:06 [pool-1-thread-1] 4
2020-07-13 15:38:08 [pool-1-thread-1] 3
2020-07-13 15:38:10 [pool-1-thread-1] 2
2020-07-13 15:38:12 [pool-1-thread-1] 1
2020-07-13 15:38:14 [pool-1-thread-1] 0
Process finished with exit code 0
要注意到是2秒打印一次
最后
以上就是追寻雪糕最近收集整理的关于Java并发编程—如何取消定时任务的全部内容,更多相关Java并发编程—如何取消定时任务内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复