一、ScheduledExecutorService 的延时执行功能
    ScheduledExecutorService 是延时执行的线程池,推荐用 ScheduledExecutorService 代替 timer 定时器。
    创建一个 ScheduledExecutorService 很简单

    1. ScheduledExecutorService service = Executors.newScheduledThreadPool(num);

    延时 n 秒执行:

    1. //延时n秒执行
    2. service.schedule(Runnable, n, TimeUnit.SECONDS);
    3. service.schedule(Callable, n, TimeUnit.SECONDS);

    栗子:

    1. public static void main(String[] args) {
    2. ScheduledExecutorService service = Executors.newScheduledThreadPool(3);
    3. System.out.println("开始任务");
    4. //延时3秒执行
    5. service.schedule(new Runnable() {
    6. @Override
    7. public void run() {
    8. System.out.println("执行任务");
    9. }
    10. }, 3, TimeUnit.SECONDS);
    11. }


    log:

    1. 12-25 16:46:12.700 30954-30954/lbx.myapplication I/System.out: 开始任务
    2. 12-25 16:46:15.710 30954-31120/lbx.myapplication I/System.out: 执行任务

    看下 log 的时间,可以发现,Runnable 里的代码是在 3 秒后执行的。

    二、ScheduledExecutorService 的循环执行功能

    1. //循环执行任务,首先延时m秒执行,n秒循环一次
    2. service.scheduleAtFixedRate(Runnable, m, n, TimeUnit.SECONDS);

    栗子:

    1. public static void main(String[] args) {
    2. ScheduledExecutorService service = Executors.newScheduledThreadPool(3);
    3. System.out.println("开始任务");
    4. //延时3秒执行,每1秒执行一次
    5. service.scheduleAtFixedRate(new Runnable() {
    6. @Override
    7. public void run() {
    8. System.out.println("执行任务");
    9. }
    10. }, 3, 1, TimeUnit.SECONDS);
    11. }

    log:

    1. 12-25 16:49:56.000 7698-7698/lbx.myapplication I/System.out: 开始任务
    2. 12-25 16:49:59.000 7698-7847/lbx.myapplication I/System.out: 执行任务
    3. 12-25 16:50:00.000 7698-7847/lbx.myapplication I/System.out: 执行任务
    4. 12-25 16:50:01.000 7698-8406/lbx.myapplication I/System.out: 执行任务
    5. 12-25 16:50:02.000 7698-8406/lbx.myapplication I/System.out: 执行任务
    6. 12-25 16:50:03.000 7698-8406/lbx.myapplication I/System.out: 执行任务
    7. 12-25 16:50:04.000 7698-8406/lbx.myapplication I/System.out: 执行任务

    可以发现,刚开始演示了三秒,后续每 1 秒执行了一次 Runnable 里的代码逻辑。
    三、ScheduledThreadPoolExecutor 的使用

    ScheduledThreadPoolExecutor 是 ScheduledExecutorService 的子类,

    1. ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(num);

    它有以下常用的方法:

    1. //获取未完成的任务队列
    2. executor.getQueue();
    3. //移除任务队列中的任务 future = executor.scheduleAtFixedRate/scheduleWithFixedDelay
    4. executor.remove((Runnable) future);
    5. //取消任务队列中的schedule任务,但不会在队列中删除,即getQueue的数量不会减1,executor.setRemoveOnCancelPolicy(true)的时候减1
    6. boolean cancel = future.cancel(true);
    7. //schedule任务是否取消
    8. future.isCancelled()
    9. //延时的schedule在shutdown后,不会继续执行没到时间的任务,默认是true,会执行一次正在倒计时的任务再结束
    10. executor.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
    11. //延时的scheduleAtFixedRate/scheduleWithFixedDelay在shutdown后,不会继续执行没到时间的任务,默认是true,会执行一次正在倒计时的任务再结束
    12. executor.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);

    ————————————————
    版权声明:本文为CSDN博主「迷了路的木头人z」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/h610968110/article/details/78894513