您好,登錄后才能下訂單哦!
這篇文章給大家介紹Executor的原理是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Executor: java線程池框架的最上層父接口,在Executor中只有executor()方法,該方法表示提交Runnable類型線程池并執行。
ExecutorService: Executor的子接口,該接口中submit()方法可接收Runnable參數或Callable參數,在使用結束后使用shutdown()方法關閉線程池,不再接收新的任務。
AbstractExecutorService: ExecutorService的默認實現類。
ScheduledExecutorService: ExecutorService的子接口,可供定時任務調度的接口。
ScheduledThreadPoolExecutor: 提供了另一種線程池,延遲執行和周期性執行的線程池。
ThreadPoolExecutor: Java線程池最核心的一個類,該類繼承自AbstractExecutorService主要功能是創建線程池,給任務分配線程資源,執行任務。
ThreadPoolExecutor有多個重載的構造方法,我們基于最完整的構造方法來分析每個參數的作用。
public ThreadPoolExecutor(int corePoolSize, //核心線程池數量 int maximumPoolSize, //最大線程池數量 long keepAliveTime, //線程數大于核心線程池數,空閑線程的最大存活時間 TimeUnit unit, //參數的時間單位 BlockingQueue<Runnable> workQueue, //線程等待隊列 ThreadFactory threadFactory, //用于設置創建線程的工廠 RejectedExecutionHandler handler) { //設置拒絕策略 if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.acc = System.getSecurityManager() == null ? null : AccessController.getContext(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = threadFactory; this.handler = handler; }
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory); }
corePoolSize與maximumPoolSize相等,即其線程全為核心線程,是一個固定大小的線程池,是其優勢;
keepAliveTime = 0 該參數默認對核心線程無效,而FixedThreadPool全部為核心線程;
workQueue 為LinkedBlockingQueue(無界阻塞隊列),隊列最大值為Integer.MAX_VALUE。如果任務提交速度持續大余任務處理速度,會造成隊列大量阻塞。因為隊列很大,很有可能在拒絕策略前,內存溢出。是其劣勢;
FixedThreadPool的任務執行是無序的;
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory)); }
控制線程池中corePoolSize與maximumPoolSize都為1
FinalizableDelegatedExecutorService繼承DelegatedExecutorService,DelegatedExecutorService最終繼承AbstractExecutorService,該類是線程池的一個代理模式的實現,相比于ThreadPoolExecutor閹割一部分功能,形成線程池單例化。
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), threadFactory); }
corePoolSize = 0,maximumPoolSize = Integer.MAX_VALUE,即線程數量幾乎無限制
keepAliveTime = 60s,60s后空閑線程自動結束
SynchronousQueue 為同步隊列,入隊出隊必須同時傳遞,因為CachedThreadPool線程創建無限制,不會有隊列等待
public static ScheduledExecutorService newScheduledThreadPool( int corePoolSize, ThreadFactory threadFactory) { return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory); }
newScheduledThreadPool為定長線程池,限定核心線程數
ScheduledThreadPoolExecutor方法中對線程池參數做了進一步的封裝,設置maximumPoolSize = Integer.MAX_VALUE,keepAliveTime = 0
調用scheduleAtFixedRate()方法可進行周期性任務設置
public static ExecutorService newWorkStealingPool(int parallelism) { return new ForkJoinPool (parallelism, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); }
ForkJoinPool繼承AbstractExecutorService,ForkJoinPool可以充分利用多核cpu的優勢,將一個任務拆分成多個“小任務”并行計算,提高任務的執行時間
關于Executor的原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。