線程詳解

線程狀態

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了,中斷標誌會被清除掉,上述方法判斷無效。

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