![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0DOW9GdlJWYzxGUIF0TDVTWGFzQnJURCRFeyMmOr9UR1w2b6hXbR9ULlFEeQ9EUIZULzUGa5cENOBlevpGe0JXSalTb51jblt2b0ZSO4UDN4kDM0YTM9U2PiVjMxADMwQmN0EDN0YjYhZGZllTZhhTNvwFcvRnLlR3buFWZs5SZslmZuEzLc9CX6MHc0RHaiojIsJye.jpg)
在HotSpot虛拟機中,Java中的線程将會被一一映射為作業系統的線程。
在Java虛拟機層面,使用者将多個任務送出給Executor架構,Executor負責配置設定線程執行它們;
在作業系統層面,作業系統再将這些線程配置設定給處理器執行。
Executor架構中的所有類可以分成三類:
任務
任務有兩種類型:Runnable和Callable。
任務執行器
Executor架構最核心的接口是Executor,它表示任務的執行器。
Executor的子接口為ExecutorService。
ExecutorService有兩大實作類:ThreadPoolExecutor和ScheduledThreadPoolExecutor。
執行結果
Future接口表示異步的執行結果,它的實作類為FutureTask。
Executors工廠類可以建立四種類型的線程池,通過Executors.newXXX即可建立。
1
2
3
它是一種固定大小的線程池;
corePoolSize和maximunPoolSize都為使用者設定的線程數量nThreads;
keepAliveTime為0,意味着一旦有多餘的空閑線程,就會被立即停止掉;但這裡keepAliveTime無效;
阻塞隊列采用了LinkedBlockingQueue,它是一個無界隊列;
由于阻塞隊列是一個無界隊列,是以永遠不可能拒絕任務;
由于采用了無界隊列,實際線程數量将永遠維持在nThreads,是以maximumPoolSize和keepAliveTime将無效。
它是一個可以無限擴大的線程池;
它比較适合處理執行時間比較小的任務;
corePoolSize為0,maximumPoolSize為無限大,意味着線程數量可以無限大;
keepAliveTime為60S,意味着線程空閑時間超過60S就會被殺死;
采用SynchronousQueue裝等待的任務,這個阻塞隊列沒有存儲空間,這意味着隻要有請求到來,就必須要找到一條工作線程處理他,如果目前沒有空閑的線程,那麼就會再建立一條新的線程。
它隻會建立一條工作線程處理任務;
采用的阻塞隊列為LinkedBlockingQueue;
它用來處理延時任務或定時任務。
它接收SchduledFutureTask類型的任務,有兩種送出任務的方式:
scheduledAtFixedRate
scheduledWithFixedDelay
SchduledFutureTask接收的參數:
time:任務開始的時間
sequenceNumber:任務的序号
period:任務執行的時間間隔
它采用DelayQueue存儲等待的任務
DelayQueue内部封裝了一個PriorityQueue,它會根據time的先後時間排序,若time相同則根據sequenceNumber排序;
DelayQueue也是一個無界隊列;
工作線程的執行過程:
工作線程會從DelayQueue取已經到期的任務去執行;
執行結束後重新設定任務的到期時間,再次放回DelayQueue