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實現的