目錄
一、ScheduledThreadPoolExecutor的創建
二、ScheduledThreadPoolExecutor的實作
ScheduledThreadPoolExecutor 類繼承了 ThreadPoolExecutor并實作了 ScheduledExecutorService介面,主要用于在給定的延遲后執行任務或者定期執行任務,作用類似于java.util包下的 Timer類,但是比 Timer功能更強大、更靈活,因為 Timer只能控制單個執行緒延遲或定期執行,而 ScheduledThreadPoolExecutor對應的是多個執行緒的后臺執行緒,
一、ScheduledThreadPoolExecutor的創建
可以利用 Executors工廠類創建定期執行任務:ScheduledThreadPoolExecutor 和 SingleThreadScheduledExecutor,
ScheduledThreadPoolExecutor:適用于若干個(固定)執行緒延時或者定期執行任務,同時為了滿足資源管理的需求而需要限制后臺執行緒數量的場景,
ScheduledExecutorService stp = Executors.newScheduledThreadPool(int threadNums);
ScheduledExecutorService stp = Executors.newScheduledThreadPool(int threadNums, ThreadFactory threadFactory);
SingleThreadScheduledExecutor:適用于需要單個執行緒延時或者定期的執行任務,同時需要保證各個任務順序執行的應用場景,
ScheduledExecutorService stse = Executors.newSingleThreadScheduledExecutor(int threadNums);
ScheduledExecutorService stp = Executors.newSingleThreadScheduledExecutor(int threadNums, ThreadFactory threadFactory);
二、ScheduledThreadPoolExecutor的實作
通過查看原始碼,可以發現 ScheduledThreadPoolExecutor的實作主要是通過把任務封裝為 ScheduledFutureTask來實作,ScheduledThreadPoolExecutor通過它的 scheduledAtFixedTime() 方法或者scheduledWithFixedDelay()方法向阻塞佇列添加一個實作了 RunnableScheduledFutureTask介面的 ScheduledFutureTask類物件,
ScheduledFutureTask 主要包括3個成員變數:
private final long sequenceNumber;
private long time;
private final long period;
sequenceNumber:序列號,用于保存任務添加到阻塞佇列的順序;
time:用于保存該任務將要被執行的具體時間;
period:周期,用于保存任務執行的間隔周期;
此外,ScheduledTreadPoolExecutor的阻塞佇列是用 DelayQueue實作的,可以實作元素延時 delayTime后才能獲取元素,在 ScheduledThreadPoolExecutor中,DelayQueue內部封裝了一個 PriorityQueue,來對任務進行排序,首先對 time排序,time小的在前,如果 time一樣,則 sequence小的在前,也就是說如果 time一樣,那么先被提交的任務先執行,因為 DelayQueue是一個無界的佇列,因此執行緒池的 maximumPoolSize是無效的,ScheduledThreadPoolExecutor的作業流程大致如下:
【1】主執行緒把呼叫 ScheduledFutureTask物件的 scheduledAtFixedRate() 或者scheduledWithFixedDelay()方法,把 Runnable或者 Callable物件包裝成 ScheduledFutureTask物件添加到阻塞佇列中;
【2】執行緒池中的執行緒1從阻塞佇列中獲取到期的 ScheduledFutureTask任務,并執行任務;(到期的意思就是當前時間大于time)
【3】執行完任務后把成員變數 time改為下次要執行任務的時間,然后把新的 ScheduledFutureTask任務重新放入阻塞佇列中;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/196448.html
標籤:其他
下一篇:QT滑鼠右鍵彈出選單選項
