天天看點

java面試-Java并發編(十一)——線程池(2)

java面試-Java并發編(十一)——線程池(2)

在HotSpot虛拟機中,Java中的線程将會被一一映射為作業系統的線程。 

在Java虛拟機層面,使用者将多個任務送出給Executor架構,Executor負責配置設定線程執行它們; 

在作業系統層面,作業系統再将這些線程配置設定給處理器執行。

java面試-Java并發編(十一)——線程池(2)

Executor架構中的所有類可以分成三類:

任務 

任務有兩種類型:Runnable和Callable。

任務執行器 

Executor架構最核心的接口是Executor,它表示任務的執行器。 

Executor的子接口為ExecutorService。 

ExecutorService有兩大實作類:ThreadPoolExecutor和ScheduledThreadPoolExecutor。

執行結果 

Future接口表示異步的執行結果,它的實作類為FutureTask。

Executors工廠類可以建立四種類型的線程池,通過Executors.newXXX即可建立。

1

2

3

java面試-Java并發編(十一)——線程池(2)

它是一種固定大小的線程池;

corePoolSize和maximunPoolSize都為使用者設定的線程數量nThreads;

keepAliveTime為0,意味着一旦有多餘的空閑線程,就會被立即停止掉;但這裡keepAliveTime無效;

阻塞隊列采用了LinkedBlockingQueue,它是一個無界隊列;

由于阻塞隊列是一個無界隊列,是以永遠不可能拒絕任務;

由于采用了無界隊列,實際線程數量将永遠維持在nThreads,是以maximumPoolSize和keepAliveTime将無效。

java面試-Java并發編(十一)——線程池(2)

它是一個可以無限擴大的線程池;

它比較适合處理執行時間比較小的任務;

corePoolSize為0,maximumPoolSize為無限大,意味着線程數量可以無限大;

keepAliveTime為60S,意味着線程空閑時間超過60S就會被殺死;

采用SynchronousQueue裝等待的任務,這個阻塞隊列沒有存儲空間,這意味着隻要有請求到來,就必須要找到一條工作線程處理他,如果目前沒有空閑的線程,那麼就會再建立一條新的線程。

java面試-Java并發編(十一)——線程池(2)

它隻會建立一條工作線程處理任務;

采用的阻塞隊列為LinkedBlockingQueue;

它用來處理延時任務或定時任務。 

java面試-Java并發編(十一)——線程池(2)

它接收SchduledFutureTask類型的任務,有兩種送出任務的方式:

scheduledAtFixedRate

scheduledWithFixedDelay

SchduledFutureTask接收的參數:

time:任務開始的時間

sequenceNumber:任務的序号

period:任務執行的時間間隔

它采用DelayQueue存儲等待的任務

DelayQueue内部封裝了一個PriorityQueue,它會根據time的先後時間排序,若time相同則根據sequenceNumber排序;

DelayQueue也是一個無界隊列;

工作線程的執行過程:

工作線程會從DelayQueue取已經到期的任務去執行;

執行結束後重新設定任務的到期時間,再次放回DelayQueue