執行緒的生命週期:
New -> Runnable -> Running -> Blocked -> Dead
➢ New(新建): 新建立的執行緒經過初始化後, 進入Runnable狀態
➢ Runnable(就緒): 等待執行緒排程, 排程後進入執行狀態
➢ Running(執行): 執行緒正常執行
➢ Blocked(阻塞): 暫停執行, 解除阻塞後進入Runnable狀態重新等待排程
※3種情形從Running進入Blocked※
1. 同步: 因資源被其他執行緒鎖定, 進入Locked狀態, 直到該資源被釋放才解除
2. 睡眠: 執行緒執行sleep()或join()方法, 執行緒進入sleeping狀態, 區別在於sleep等待的時間是固定的, 而join則是等待子執行緒執行完畢
3. 等待: 執行緒中執行wait()方法, 執行緒進入waiting狀態, 直到收到其他執行緒通知被喚醒
➢ Dead(消亡): 執行緒方法執行完畢返回或者異常終止
簡單測試多執行緒join的方法:
from threading import Thread
import time
def waitingOne():
print('start waiting - 1:' + time.strftime('%H:%M:%S') + '\n')
time.sleep(3)
print('stop waiting - 1:' + time.strftime('%H:%M:%S') + '\n')
def waitingTwo():
print('start waiting - 2:' + time.strftime('%H:%M:%S') + '\n')
time.sleep(3)
print('stop waiting - 2:' + time.strftime('%H:%M:%S') + '\n')
task = []
thread1 = Thread(target = waitingOne)
thread1.start()
thread2 = Thread(target = waitingTwo)
thread2.start()
task.append(thread2)
print('Start join: ' + time.strftime('%H:%M:%S') + '\n')
for i in task:
i.join()
print('End join: ' + time.strftime('%H:%M:%S') + '\n')
執行結果:
start waiting - 1: 14:13:29
Start join: 14:13:29
start waiting - 2: 14:13:29
stop waiting - 1: 14:13:32
End join: 14:13:37
start waiting - 2: 14:13:37