Java併發程式設計——執行緒池的使用(五)延時執行的執行緒池ScheduledExecutorService
阿新 • • 發佈:2019-01-30
一、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);