線程池的類體系結構多線程
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
JAVA API 架構架構
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
- 首先明確必定是在Java裏面能夠供使用者調用的啓動線程類是Thread。所以Runnable或者Timer/TimerTask等都是要依賴Thread來啓動的,所以在ThreadPool裏面一樣也是靠Thread來啓動多線程的。
- 默認狀況下Runnable接口執行完畢後是不能拿到執行結果的,所以在ThreadPool裏就定義了一個Callable接口來處理執行結果。
- 爲了異步阻塞的獲取結果,Future能夠幫助調用線程獲取執行結果。
- Executor解決了向線程池提交任務的入口問題,同時ScheduledExecutorService解決了如何進行重複調用任務的問題。
- CompletionService解決了如何按照執行完畢的順序獲取結果的問題,這在某些狀況下能夠提升任務執行的併發,調用線程沒必要在長時間任務上等待過多時間。
- 顯然線程的數量是有限的,並且也不宜過多,所以合適的任務隊列是必不可少的,BlockingQueue的容量正好能夠解決此問題。
- 固定任務容量就意味着在容量滿了之後須要必定的策略來處理過多的任務(新任務),RejectedExecutionHandler正好解決此問題。
- 必定時間內阻塞就意味着有超時,所以TimeoutException就是爲了描述這種現象。TimeUnit是爲了描述超時時間方便的一個時間單元枚舉類。
- 配置一個合適的線程池是很複雜的,所以Executors默認的一些線程池配置能夠減小這個操做。
小福利:知乎上回答的關於併發的書籍和博客 點擊查看併發