第三講:線程和線程池

1. 線程的創建:

     繼承Thread類,或者實現Runnable接口。

2. 線程的狀態轉換:

    創建——可執行——執行——阻塞/等待

  • 阻塞:當一個線程試圖獲取一個內部的對象鎖(非java.util.concurrent庫中的鎖),而該鎖被其他線程持有,則該線程進入阻塞狀態。
  • 等待:當一個線程等待另一個線程通知調度器一個條件時,該線程進入等待狀態。例如調用:Object.wait()以及等待Lock或Condition。
  (1)從創建到可執行,調用run()
  (2)從可執行到執行,調用該線程
    (3)   執行到等待,調用wait(),並釋放鎖,需要notiy()或者notifyAll()喚醒
  (4)執行到阻塞,調用sleep(),不釋放鎖,注意sleep後,線程是回到可執行狀態,並不是執行狀態,什麼時候執行那是由虛擬 機來決定的。
  (5)調用lock或者Synchronize,就進入鎖的等待隊列
另外,yield這個方法是讓當前線程回到可執行狀態,以便讓具有相同優先級的線程進入執行狀態

3. 線程池
線程池參數:核心線程數、最大線程數、WaitQueue等。
當線程的核心線程數、最大線程數、WaitQueue都滿了,新來的線程將有4種處理方式:
(1)拋棄
(2)空操作
(3)拋棄最老的線程
(4)讓調用線程處理
線程池的3種類型如下,主要根據核心線程數和最大線程數區分:
(1)NewCacheThreadPool, 核心線程數1,最大線程數Integer.maxNumber
  (2) NewFixedThreadPool, 核心線程數x, 最大線程數x, 其中x是用戶自己設定的
(3)NewSingleThreadExecuto,核心線程數1,最大線程數1
這三種類型線程池的內部都是通過ThreadPoolExecutor實現的







  

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