線程

創建線程的方式及實現

  1. 繼承 Thread 類,重寫 run() 方法。
  2. 實現 Runnable 接口,實現 run() 方法。
  3. 實現 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 和 定期執行任務
      Executor

線程池的幾種方式

  • 利用 Executors靜態工廠 創建不同的線程池滿足不同場景的需求
  • newFixedThreadPool(int nThreads):指定工作線程數量的線程池
  • newCachedThreadPool():處理大量短時間工作任務的線程池
    • 試圖緩存線程並重用,當無緩存線程可用時,就會創建新的工作線程
    • 如果線程閒置的時間超過閾值,則會被終止並移出緩存
    • 系統長時間閒置的時候,不會消耗什麼資源
  • newSingleThreadExecutor():創建唯一的工作線程來執行任務,如果線程異常結束,會有另一個線程取代它
  • newSingleThreadScheduledExecutor() 和 newScheduledThreadPool(int corePoolSize):定時或者週期性的工作調度,兩者的區別在於單一工作線程還是多個線程
  • newWorkStealingPool():內部會構建 ForkJoinPool,利用working-stealing算法,並行的處理任務,不保證處理順序。
  • 線程池的大小如何選定
    • CPU密集型:線程數 = 按照核數或者核數 + 1設定
    • I/O密集型:線程數 = CPU核數 * (1 + 平均等待時間/平均工作時間)

線程的生命週期(√)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章