您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java線程池的用法”,在日常操作中,相信很多人在Java線程池的用法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java線程池的用法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
ThreadPoolExecutor是Java線程池中最核心的一個類。
public interface Executor { void execute(Runnable command); } public interface ExecutorService implements Executor {} public abstract class AbstractExecutorService implements ExecutorService {} public class ThreadPoolExecutor extends AbstractExecutorService { 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; } }
核心線程池的大小
線程池允許執行的最大線程數量,當超過這個數量后,任務將存放在workQueue中。
當線程池中線程數量大于核心線程池大小時,線程執行完之后就會銷毀掉,直到線程池數量不超過核心線程池大小。
keepAliveTime的單位,常見的有DAYS、HOURS、MINUTES、SECONDS、MILLISECONDS、MICROSECONDS、NANOSECONDS
阻塞隊列,用于存儲等待執行的任務。一般有以下幾種選擇
有界隊列,當有新任務到來時 當實際線程數小于corePoolSize時,線程池會生成新的線程執行任務; 當實際線程數大于corePoolSize時,新任務就會加入等待隊列,當等待隊列滿的時候,則會在實際線程不大于maximumPoolSize的前提下創建新線程去處理任務。
無界任務隊列,當有新任務到來時 當實際線程數小于corePoolSize時,線程池會生成新的線程執行任務,當實際線程數大于corePoolSize時,新任務就會加入等待隊列。如果創建速度大于處理速度,則隊列會一直增長,直到耗盡內存。
直接提交的隊列,當有新任務到來時 當實際線程數小于maximumPoolSize時,線程池會生成新的線程執行任務; 當實際線程數大于maximumPoolSize時,新任務就會加入等待隊列,但隊列只會保存最新提交的一個任務。
用來創建線程的工廠
表示拒絕處理任務的策略,有以下取值
ThreadPoolExecutor.AbortPolicy //丟棄任務并拋出RejectedExecutionException異常 ThreadPoolExecutor.DiscardPolicy //也是丟棄任務,但是不拋出異常。 ThreadPoolExecutor.DiscardOldestPolicy //丟棄隊列最前面的任務,然后重新嘗試執行任務(重復此過程) ThreadPoolExecutor.CallerRunsPolicy //由調用線程處理該任務
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor( 0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
無界線程池,最大線程池為Integer的最大值,線程過大時可能導致OOM。
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor( nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
固定大小的線程池。線程數量外部傳入
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }
單一線程池
到此,關于“Java線程池的用法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。