創建線程的方式及實現
- 繼承 Thread 類,重寫 run() 方法。
- 實現 Runnable 接口,實現 run() 方法。
- 實現 Callable 接口,實現 call() 方法。和 Runnable 的區別是,Callable 支持返回值。
sleep() 、join()、yield() 有什麼區別
說說 CountDownLatch 原理
- CountDownLatch是同步工具類之一,可以指定一個計數值,在併發環境下由線程進行減1操作,當計數值變爲0之後,
被await方法阻塞的線程將會喚醒
,實現線程間的同步。
說說 CyclicBarrier 原理
- 循環柵欄,它的作用就是
會讓一組線程都等待完成後纔會繼續下一步行動
,而且它是可以被重用的。比如可以用於多線程計算數據,最後合併計算結果的場景。
說說 Semaphore 原理
- 信號量,用來控制訪問特定資源的線程數量。
- 線程可以
通過acquire()方法來獲取信號量的許可
,當信號量中沒有可用的許可的時候,線程阻塞,直到有可用的許可爲止。線程可以通過release()方法釋放它持有的信號量的許可
。
說說 Exchanger 原理
- 交換者,用於
線程間協作的工具類
,當一個線程到達 exchange 調用點時,如果它的夥伴線程此前已經調用了此方法,那麼它的夥伴會被調度喚醒並與之進行對象交換,然後各自返回。如果它的夥伴還沒到達交換點,那麼當前線程將會被掛起,直至夥伴線程到達完成交換正常返回,或者當前線程被中斷拋出中斷異常,又或者是等候超時拋出超時異常。
ThreadLocal 原理分析
講講線程池的實現原理
- 爲什麼要使用線程池?
- 降低資源消耗
- 提高線程的可管理性
- JUC的三個Executor接口
- Executor:運行新任務的簡單接口,將任務提交和任務執行細節解耦
- ExecutorService:具備管理執行器和任務生命週期的方法,提交任務機制更完善
- ScheduledExecutorService:支持 Feature 和 定期執行任務
線程池的幾種方式
- 利用 Executors靜態工廠 創建不同的線程池滿足不同場景的需求
newFixedThreadPool(int nThreads)
:指定工作線程數量的線程池newCachedThreadPool()
:處理大量短時間工作任務的線程池- 試圖緩存線程並重用,當無緩存線程可用時,就會創建新的工作線程
- 如果線程閒置的時間超過閾值,則會被終止並移出緩存
- 系統長時間閒置的時候,不會消耗什麼資源
newSingleThreadExecutor()
:創建唯一的工作線程來執行任務,如果線程異常結束,會有另一個線程取代它newSingleThreadScheduledExecutor() 和 newScheduledThreadPool(int corePoolSize)
:定時或者週期性的工作調度,兩者的區別在於單一工作線程還是多個線程newWorkStealingPool()
:內部會構建 ForkJoinPool,利用working-stealing算法,並行的處理任務,不保證處理順序。- 線程池的大小如何選定
CPU密集型
:線程數 = 按照核數或者核數 + 1設定I/O密集型
:線程數 = CPU核數 * (1 + 平均等待時間/平均工作時間)