多線程問題2

新建(new Thread) 當創建Thread類的一個實例(對象)時,此線程進入新建狀態(未被啓動)。 例如:Thread  t1=new Thread();

就緒(runnable) 線程已經被啓動,正在等待被分配給CPU時間片,也就是說此時線程正在就緒隊列中排隊等候得到CPU資源。例如:t1.start();

運行(running) 線程獲得CPU資源正在執行任務(run()方法),此時除非此線程自動放棄CPU資源或者有優先級更高的線程進入,線程將一直運行到結束。
死亡(dead) 當線程執行完畢或被其它線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。
自然終止:正常運行run()方法後終止
異常終止:調用stop()方法讓一個線程終止運行

堵塞(blocked) 由於某種原因導致正在運行的線程讓出CPU並暫停自己的執行,即進入堵塞狀態。
正在睡眠:用sleep(long t) 方法可使線程進入睡眠方式。一個睡眠着的線程在指定的時間過去可進入就緒狀態。
正在等待:調用wait()方法。(調用notify()方法回到就緒狀態)
被另一個線程所阻塞:調用suspend()方法。(調用resume()方法恢復)

常用方法
void run()   //創建該類的子類時必須實現的方法
void start() //開啓線程的方法
static void sleep(long t) //釋放CPU的執行權,不釋放鎖
static void sleep(long millis,int nanos)
final void wait()//釋放CPU的執行權,釋放鎖
final void notify()
static void yied()//可以對當前線程進行臨時暫停(讓線程將資源釋放出來)
public final void stop()//結束線程,但由於安全的原因過時
注意:結束線程原理---就是讓run方法結束。而run方法中通常會定義循環結構,所以只要控制住循環即可。
方法----可以boolean標記的形式完成,只要在某一情況下將標記改變,讓循環停止即可讓線程結束。但是,特殊情況,線程在運行過程中,處於了凍結狀態,是不可能讀取標記的。
那麼這時,可以通過正常方式恢復到可運行狀態,也可以強制讓線程恢復到可運行狀態,通過Thread類中的,interrupt():清除線程的凍結狀態,但這種強制清除會發生InterruptedException。所以在使用 wait,sleep,join方法的時候都需要進行異常處理。
死鎖

兩個線程A、B用到同一個對象s(s爲共享資源),且線程A在執行中要用到B運行後所創造的條件。在這種前提下A先開始運行,進入同步塊後,對象s被鎖定,接着線程A因等待B運行結束而進入阻塞狀態,於是B開始運行,但因無法訪問對象s,線程B也進入阻塞狀態,等待s被線程A解鎖。最終的結果:兩個線程互相等待,都無法運行。

線程同步通信 爲避免死鎖,就應該讓線程在進入阻塞狀態時儘量釋放其鎖定的資源,以爲其他的線程提供運行的機會,Object類中定義了幾個有用的方法:wait()、notify()、notifyAll()。
wait():被鎖定的對象可以調用wait()方法,這將導致當前線程被阻塞並釋放該對象的互斥鎖,即解除了wait()方法當前對象的鎖定狀態,其他的線程就有機會訪問該對象。
notify():喚醒調用wait()方法後被阻塞的線程。每次運行該方法只能喚醒一個線程。
notifyAll():喚醒所有調用wait()方法被阻塞的線程。

發佈了55 篇原創文章 · 獲贊 21 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章