原文作者:szlcy
package 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秒打印一次
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38893.html