1.爲何要用線程池?java
線程池提供了一種限制和管理資源(包括執行一個任務)。每一個線程池還維護一些基本統計信息,例如已完成任務的數量。編程
《java併發編程的藝術》中提到使用線程池的好處:併發
下降資源消耗。經過重複利用已建立的線程下降線程建立和銷燬形成的消耗。框架
提升響應速度。當任務到達時,任務能夠不須要等到線程建立就能當即執行。工具
提升線程的可管理性。線程是稀缺資源,若是無限制的建立,不只會消耗系統資源,還會下降系統的穩定性,使用線程池能夠進行統一的分配,調優和監控。線程
2.實現Runnable接口和Callable接口的區別code
若是想讓線程池執行任務的話就須要實現Runnable接口或Callable接口。Runnable接口或Callable接口實現類均可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor執行。二者的區別在於Runnable接口不會返回結果可是Callable接口能夠返回結果。對象
3.執行execute()方法和submit()方法的區別是什麼呢?接口
1.execute()方法用於提交不須要返回值的任務,因此沒法判斷任務是否被線程池執行成功與否;隊列
2.submit()方法用於提交須要返回值的任務。線程池會返回future類型的對象,經過這個future對象能夠判斷任務是否執行成功,而且能夠經過future的get()方法來獲取返回值,get()方法會阻塞當前線程直到任務完成,而是用get(long timeout, TimeUnit unit) 方法則會阻塞當前線程一段時間後當即返回,這時候有可能任務沒有執行完。
4.如何建立線程池
《阿里巴巴java開發手冊》中強制線程池不容許使用Exexutors去建立,而是經過ThreadPoolExextor的方式,這樣的處理方式讓寫的同窗更加明確線程池的運行規則,規避資源耗盡的風險
Executors 返回線程池對象的弊端以下: FixedThreadPool 和 SingleThreadExecutor : 容許請求的隊列長度爲 Integer.MAX_VALUE,可能堆積 大量的請求,從而致使OOM。 CachedThreadPool 和 ScheduledThreadPool : 容許建立的線程數量爲 Integer.MAX_VALUE ,可能 會建立大量線程,從而致使OOM。
方法一:經過構造方法實現
方法二:經過Executor框架的工具類Executor來實現 咱們能夠建立三種類型的ThreadPoolExecutor:
FixedThreadPool:該方法返回一個固定線程數量的線程池。該線程池中的線程數量始終不變。當有一個新的任務提交時,線程池中如有空閒線程, 則當即執行。若沒有,則新的任務會被暫存在一個任務隊列中,待有線程空閒時,便處理在任務隊列中的任務。
SingleThreadExecutor:該方法返回一個只有一個線程的線程池。若多餘一個任務被提交到該線程池,任務會被保存在一個任務隊列中,待線程空閒,按先入先出的順序執行隊列中的任務。
CachedThreadPool: 該方法返回一個可根據實際狀況調整線程數量的線程池。線程池的線程數量不肯定,但如有空閒線程能夠複用,則會優先使用可複用的線程。若全部線程均在工做,又有新的任務提交,則會建立新的線程處理任務。全部線程在當前任務執行完畢後,將返回線程池進行復用。