1. 程式人生 > >Java併發程式設計——執行緒池的使用(五)延時執行的執行緒池ScheduledExecutorService

Java併發程式設計——執行緒池的使用(五)延時執行的執行緒池ScheduledExecutorService

一、ScheduledExecutorService的延時執行功能

ScheduledExecutorService是延時執行的執行緒池,推薦用ScheduledExecutorService代替timer定時器。
建立一個ScheduledExecutorService很簡單


ScheduledExecutorService service = Executors.newScheduledThreadPool(num);

延時n秒執行:

//延時n秒執行
service.schedule(Runnable, n, TimeUnit.SECONDS);
service.schedule
(Callable, n, TimeUnit.SECONDS);

栗子:

 public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newScheduledThreadPool(3);
        System.out.println("開始任務");
        //延時3秒執行
        service.schedule(new Runnable() {
            @Override
            public void run
() { System.out.println("執行任務"); } }, 3, TimeUnit.SECONDS); }

log:

12-25 16:46:12.700 30954-30954/lbx.myapplication I/System.out: 開始任務
12-25 16:46:15.710 30954-31120/lbx.myapplication I/System.out: 執行任務

看下log的時間,可以發現,Runnable裡的程式碼是在3秒後執行的。

二、ScheduledExecutorService的迴圈執行功能

//迴圈執行任務,首先延時m秒執行,n秒迴圈一次
service.scheduleAtFixedRate(Runnable, m, n, TimeUnit.SECONDS);

栗子:

    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newScheduledThreadPool(3);
        System.out.println("開始任務");
        //延時3秒執行,每1秒執行一次
        service.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("執行任務");
            }
        }, 3, 1, TimeUnit.SECONDS);
    }

log:

12-25 16:49:56.000 7698-7698/lbx.myapplication I/System.out: 開始任務
12-25 16:49:59.000 7698-7847/lbx.myapplication I/System.out: 執行任務
12-25 16:50:00.000 7698-7847/lbx.myapplication I/System.out: 執行任務
12-25 16:50:01.000 7698-8406/lbx.myapplication I/System.out: 執行任務
12-25 16:50:02.000 7698-8406/lbx.myapplication I/System.out: 執行任務
12-25 16:50:03.000 7698-8406/lbx.myapplication I/System.out: 執行任務
12-25 16:50:04.000 7698-8406/lbx.myapplication I/System.out: 執行任務

可以發現,剛開始演示了三秒,後續每1秒執行了一次Runnable裡的程式碼邏輯。

三、ScheduledThreadPoolExecutor的使用

ScheduledThreadPoolExecutor是ScheduledExecutorService的子類,

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(num);

它有以下常用的方法:

//獲取未完成的任務佇列
executor.getQueue();
//移除任務佇列中的任務  future = executor.scheduleAtFixedRate/scheduleWithFixedDelay
executor.remove((Runnable) future);
//取消任務佇列中的schedule任務,但不會在佇列中刪除,即getQueue的數量不會減1,executor.setRemoveOnCancelPolicy(true)的時候減1
boolean cancel = future.cancel(true);
//schedule任務是否取消
future.isCancelled()
//延時的schedule在shutdown後,不會繼續執行沒到時間的任務,預設是true,會執行一次正在倒計時的任務再結束
executor.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
//延時的scheduleAtFixedRate/scheduleWithFixedDelay在shutdown後,不會繼續執行沒到時間的任務,預設是true,會執行一次正在倒計時的任務再結束
executor.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);