線程狀態
public enum State {
// 剛創建線程.還未執行
NEW,
//線程已啓動,或在等待分配cpu時間片
RUNNABLE,
//線程阻塞狀態,等待進入臨界區,通過synchronized等待監視器鎖
BLOCKED,
//線程等待狀態,通過Object.wait來等待(Thread.join也是通過wait來實現的),如果收到其他線程的notify,則進入RUNNABLE狀態
WAITING,
//包含超時時間的線程等待狀態
TIMED_WAITING,
//運行完成,退出Thread.run方法
TERMINATED;
}
主要操作
Thread對象表示線程對象實例,主要操作如下。
1、start/run
start()通過native void start0()來創建線程,創建完畢後存在2個線程,一個是執行start的原線程,一個是通過start0()新啓動的新線程。
run()並不需要用戶來調用,如果通過start啓動的線程獲得了cpu執行時間後,即進入run方法來進行執行。
2、sleep/yield
sleep和yield一樣都是釋放cpu時間,而且都不釋放鎖。
3、join
join實際上是在當前Thread對象上調用wait來等待,等待該Thread對象實例執行完畢調用nofityAll來喚醒原線程的等待。
//join方法體
if (millis == 0) {
while (isAlive()) {
wait(0);
}
}
線程退出時執行exit()方法
private void exit() {
if (group != null) {
group.threadTerminated(this);
group = null;
}
......
}
void threadTerminated(Thread t) {
synchronized (this) {
remove(t);
if (nthreads == 0) {
notifyAll();
}
if (daemon && (nthreads == 0) &&
(nUnstartedThreads == 0) && (ngroups == 0))
{
destroy();
}
}
}
注意點:不要在Thread對象上手動調用wait和notify,否則會受到系統API的影響。
4、interrupt
中斷需要被捕獲,纔會處理,否則不處理中斷。
public void interrupt() ; //中斷線程
public boolean isInterrupted();//判斷是否中斷
public static boolean interrupted(); //判斷是否中斷,並清除中斷狀態
注意點:如果中斷被catch了,中斷標誌會被清除掉,上述方法判斷無效。