最近看源碼有點小感悟:要帶著問題去看源碼刀荒,這樣才不至于把看源碼當(dāng)成了走馬觀花。
自1.5加入 java.util.concurrent 包之后钙皮,java在多線程方面又有了里程碑式的提升铅匹,今天來聊一聊多線程中java線程池的實現(xiàn)伏社。
今天要根據(jù)以下的幾個問題來分析一下java線程池:
1.線程池的主體結(jié)構(gòu),其中有哪些重要的成員變量
2.往線程池中添加一個任務(wù)到底發(fā)生了什么
3.線程池的實現(xiàn)原理叶堆,創(chuàng)建線程的時機 (重點)
4.線程復(fù)用的實質(zhì) (重點)
5.任務(wù)如果有返回值阱飘,完成后返回值的獲取
6.線程池的關(guān)閉
7.線程池的拒絕策略,什么時候會使用拒絕策略
8.OkHttp3中線程池的使用(分析okhttp源碼的時候再說)
1.首先來看看線程池的主體結(jié)構(gòu)與重要的成員變量
下面主要分析這幾個類之間的關(guān)系與組成
1.Executor是整個框架的基石虱颗,其中只有一個execute方法用于往線程池中添加任務(wù)(執(zhí)行任務(wù))而另外一種往線程池中添加任務(wù)的方式是調(diào)用ExecutorService 中的submit沥匈。
2.ExecutorService 繼承自 Executor,其主要作用是用來管理線程池的生命周期忘渔,同時也能往線程池中添加任務(wù)高帖。
3.AbstractExecutorService繼承自ExecutorService,其主要作用是實現(xiàn)了 submit 方法畦粮,同時提供了一系列批量添加任務(wù)的invokeAny方法
4.ThreadPoolExecutor是最主要的結(jié)構(gòu)體散址,實現(xiàn)添加任務(wù)與線程調(diào)度,同時包含線程池的拒絕策略宣赔。
5.FutureTask實現(xiàn)了Runnable 與 Future接口预麸,所以最終任務(wù)的執(zhí)行是執(zhí)行該類中的run方法,同時返回值也是在該類中獲取
6.線程池中目前共有4中已經(jīng)實現(xiàn)的拒絕策略儒将,如果需自定義也可以自己實現(xiàn)邏輯
7.ThreadPoolExecutor中的幾個重要變量 :
(1)corePoolSize:核心線程數(shù)
(2)