線程池的做用緩存
1.下降資源的消耗ide
2.提升效率this
3.方便管理spa
相關概念線程
corePoolSize核心線程數:核心池的大小,當有任務到達以後,就會建立一個線程去執行任務,當任務數量到達核心線程數後,就會把到達的任務放到緩存隊列中去。code
maximumPoolSize: 線程池最大線程數,它表示在線程池中最多能建立多少個線程。blog
keepAliveTime:表示線程沒有任務執行是,最多保持多久的時間就會終止。隊列
unit:參數keepAliveTime的時間單位,有7種取值,具體在TimeUnit類中。資源
線程池運行原理:get
1.原理剖析
提交一個任務到線程池中,線程池的處理流程以下:
①判斷線程池裏的核心線程是否都在執行任務,若是不是(核心線程空閒或者還有核心線程沒有被建立)則建立一個新的工做線程來執行任務。若是核心線程都在執行任 務,則進入下個流程。
②線程池判斷工做隊列是否已滿,若是工做隊列沒有滿,則將新提交的任務存儲在這個工做隊列裏。若是工做隊列滿了,則進入下個流程。
③判斷線程池裏的線程是否都處於工做狀態,若是沒有,則建立一個新的工做線程來執行任務。若是已經滿了,則交給飽和策略來處理這個任務。
線程池的使用:
1.自定義線程池注意事項
若是當前線程池中的線程數目小於corePoolSize,則每來一個任務,就會建立一個線程去執行這個任務;
若是當前線程池中的線程數目>=corePoolSize,則每來一個任務,會嘗試將其添加到任務緩存隊列當中,若添加成功,則該任務會等待空閒線程將其取出去執行;若添加失敗 (通常來講是任務緩存隊列已滿),則會嘗試建立新的線程去執行這個任務;
若是隊列已經滿了,則在總線程數不大於maximumPoolSize的前提下,則建立新的線程
若是當前線程池中的線程數目達到maximumPoolSize,則會採起任務拒絕策略進行處理;
若是線程池中的線程數量大於 corePoolSize時,若是某線程空閒時間超過keepAliveTime,線程將被終止,直至線程池中的線程數目不大於corePoolSize;若是容許爲核心池中 的線程設置存活時間,那麼核心池中的線程空閒時間超過keepAliveTime,線程也會被終止。
2.代碼編寫:
public class MyThreadpoll { public static void main(String[] args) { ThreadPoolExecutor th = new ThreadPoolExecutor(1, 2, 0L, TimeUnit.MICROSECONDS, new LinkedBlockingQueue<>(3)); for (int i = 0; i < 6; i++) { TaskThread tt = new TaskThread("任務 " + i); th.execute(tt); } th.shutdown(); } } class TaskThread implements Runnable { private String threadName; public TaskThread(String threadName) { this.threadName = threadName; } @Override public void run() { System.out.println(Thread.currentThread().getName() + ": " + threadName); } }
根據上述的原理分析能夠看出,當for循環運行到 i = 5時也就是運行第6個線程時,程序拋出異常