第16章 多線程基礎(02)

3.1線程的生命週期?
線程具有7個狀態:出生狀態,就緒狀態,運行狀態,等待狀態,休眠狀態,阻塞狀態和死亡狀態。
出生狀態:用戶創建線程處於的狀態。
就緒狀態:用戶調用start方法後的狀態。
運行狀態:線程得到系統資源後就進入的狀態。
等待狀態:當處於運行狀態下的線程調用Thread類中的wait()方法時,就會處於等待狀態。
    進入等待狀態的線程必須調用Thread類中的notify()方法才能被喚醒,而notifyALL()方法是將所有處於等待狀態下的線程喚醒。
休眠狀態:當線程調用Thread類中的sleep()方法,則會進入休眠狀態。
阻塞狀態:如果一個線程在運行狀態下發出輸入/輸出請求,該線程將進入阻塞狀態,在其等待輸入/輸出結束時線程進入就緒狀態。
    對於阻塞的線程來說,即使系統資源空閒,線程依然不能回到運行狀態。
死亡狀態。當線程執行完run()方法時,線程處於死亡狀態。
一旦進入可執行狀態,就會在就緒與運行狀態下輾轉,同時也可能進入等待,休眠,阻塞和死亡狀態。
 備註:在同一時間點上,只有一個線程被執行。只是線程切換比較快,所以纔有幾個線程一起執行。
使線程進入就緒狀態:
    (1)調用sleep()方法
    (2)調用wait()方法。
·    (3)等待輸入輸出完成。
使線程處於就緒狀態後,可以通過以後幾種方式使線程再次進入運行狀態(注意是再次):
(1)線程調用notify()方法。
(2)線程調用notifyAll()方法。
(3)線程調用interrupt()方法。
(4)線程的休眠時間結束。
(5)輸入輸出結束。

4.1線程的休眠
    調用sleep()方法。sleep(毫秒數)方法就是定義該線程需要休眠的時間。
    Thread。sleep(1000);表示讓線程休眠1秒。
4.2線程的加入
    在執行線程A的時候加入線程B的方法,使用Thread.join()方法。
    如:
    Thread A = new Thread(new Runnable(){
        run(){
        Thread.sleep(100);
        B.join();
}
});
    A.start();
    Thread B = new Thread(new Runnable(){
    run(){
    執行的內容。
}
B.start();
})

4.3線程的中斷
    之前的版本會使用stop()方法停止線程,但是現在已經不用了。現在提倡在線程中寫入一個無限循環,然後使用布爾型標記
控制循環的中斷。
4.4線程的禮讓
    使用yield()方法表示禮讓。它只是給當前正處於運行狀態下的線程一個提醒,告知該線程可以將資源禮讓給其他線程。
    yield()方法使具有同樣優先級的線程有進入可執行狀態的機會,噹噹前線程放棄執行權的時候會再次進入就緒狀態。對於
支持多任務的操作系統來說,不需要調用yield()方法,因爲操作系統會爲線程自動分配CPU時間片來執行。

5.1 線程的優先級
    優先級越高就先執行那個線程,但這並不意味着低優先級的線程得不到運行,而只是它運行的概率較小,比如垃圾回收線程的優先級就較低。
    線程的優先級在1~10之間,如果不在,會拋出IllegalArgumentException異常。
    線程的優先級數越大,就越先執行,一般線程優先級都會默認爲5.
    可以使用Thread。setPriority("線程A的名字",優先級數,線程名稱);
    public void setPriority(String threadName,int priority,Thread t){
        t.setPriority(priority);
        t.setName(threadName);
        t.start();
    }

6.1線程安全
    當多個線程處於同時執行狀態時就會出現錯誤,如購票時就只有1張票了,當多個人去搶時就會出現票的個數出現負數。
6.2解決上述問題的方法,提出了線程同步機制
    1.同步塊
    使用synchronized關鍵字。
    如:建立時,run(){
        while(true){
        synchronized(""){
    if(num > 0){
        
    }    
    }}
    }
備註:將資源放入同步塊中,也被成爲臨界區,通常當其他線程獲取到這個鎖時,必須等待這個鎖打開時才能使用。Object對象存在一個標誌位,
並具有兩個值0和1,一個線程的運行先檢查該對象的標誌位,如果爲0狀態,則存在其他線程在運行,這時該線程處於就緒狀態,直到執行完該同步塊中的
代碼.如果該同步塊處於1時,該線程可執行同步塊中代碼,並將Object對象標識位設置爲0。
6.3使用同步方法
    同步方法就是在方法面前修飾synchronized關鍵字的方法,語法:
    synchronized void f()    {}
    當某個對象調用了同步方法,則該對象上的其他同步方法必須等待該同步方法執行完畢才能被執行。這是必須將每個能訪問共享資源的方法修飾
爲synchronized,否則會報錯。
 

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