1. 程式人生 > >java多執行緒高階應用

java多執行緒高階應用

1.執行緒概念
java所謂多執行緒,顧名思義,就是多道執行緒執行線索,那麼為什麼要多執行緒呢?如果你的部分程式碼在執行某個i/o操作而受阻,那麼程式的其他部分也不能執行,這樣就嚴重的浪費了cpu,多執行緒機制就是為解決這個問題。
多程序並行執行時,在cpu上執行的某個程序因為等待某種資源而受阻時,多工作業系統可以使程序掛起,而根據FIFO原則,時間片輪轉等啟動另一個不同的程序執行,直到前一程序獲得
所需資源,才能喚醒該資源,讓他繼續執行。
這樣,在多工作業系統的排程下,可以讓多個程序並行執行,能夠較好地利用CPU資源,但仍然難以滿足現代應用程式的需要。
例如,需要在同一應用程式中完成聲音播放、影象顯示、網路檔案下載等多項工作,如果使用傳統的單執行緒程式,就只能順序的逐一實現,而使用多執行緒方法則可以併發實現。
程序把記憶體空間作為自己的資源之一,每個程序均有自己的記憶體單元,執行緒卻共享記憶體空間,通過共享的記憶體 空間來交換資訊,從而有利於提高效率。
java引入了優先順序的概念,優先順序越高的執行緒,獲得cpu的權利越大,執行機會越多,java把優先順序劃分為10個等級,數值也爽啊,優先順序越高,在thread類中定義了三個優先順序常量:MIN_PRIORITY,MAX_PRIORITY和NORM_PRIORITY,其直分別是1,10,5.如果沒有分配,java預設為norm_priority為5.
排程就是分配cpu資源,確定執行緒的執行順序,java採用搶佔式排程,優先順序高的執行緒具有剝奪低優先順序執行緒的執行權利。如果一個低優先順序的執行緒正在執行,這時出現一個高優先順序的執行緒,那麼低優先順序的執行緒就會停止執行,放棄cpu,退回等待佇列中,等待下一輪的執行,而讓高優先順序的執行緒立即執行。如果具有相同優先順序的執行緒,按照先來先服務的排程原則。
 我們設計程式時,應該讓高優先順序的執行緒執行一段時間後能夠交出使用權,可以使用sleep()方法暫時進入睡眠,從而讓出cpu,使有相同優先順序的執行緒和低優先順序的執行緒有執行的機會。二是呼叫yield()而放棄cpu,這時和他有相同優先順序的執行緒就有執行機會。
2.執行緒的生命週期
 
每個java程式都有一個預設的主執行緒:對於application,主執行緒是main方法執行的線索,對於applet,主執行緒指揮瀏覽器載入並執行java小程式。要想實現多執行緒,必須在主執行緒中建立新的執行緒物件,java語言使用Thread及其子類的物件表達執行緒。,
1新建:當一個Thread類或子類物件被建立後進入這個狀態,這時執行緒物件已被分配記憶體空間,其私有資料已被初始化,但該執行緒還未被排程,可用start(排程),或stop(終止);新      生執行緒一旦被排程,就將切換到可執行狀態
  2可執行:處於可執行環境隨時可以被排程而執行,分兩個子狀態:執行狀態和就緒狀態;
3 阻塞: 由某種原因引起執行緒暫停執行。
4 死亡:執行緒執行完畢或另一執行緒呼叫stop()方法使其停止時,進入停止狀態。他表示執行緒退出可執行狀態,並且不可能再進入可執行狀態。

這裡寫圖片描述

Thread定義很多控制執行緒的方法:start()呼叫run()方法使執行緒開始執行; stop()立即停止,使其內部狀態清零; suspend()暫停執行緒執行,執行緒的所有狀態和資源保持不變,以後可以通過另一個執行緒呼叫resume()方法重新啟動這個執行緒。 isAlive() 執行緒處於新建狀態時,呼叫方法返回FALSE,當一個執行緒呼叫start()方法時,佔用資源後,該執行緒run方法開始執行,在run方法結束前,即沒有進入死亡狀態之前,呼叫isAlive()返回true;,當執行緒進入死亡狀態後,實體記憶體被釋放,執行緒仍可以呼叫isalive();返回false;
建立執行緒方法:
生成Thread子類;生成一個類,宣告實現runnable介面;無論使用哪一個,我們可以控制的關鍵性操作有兩個:1定義使用者執行緒的操作,即定義使用者執行緒的run方法;2在適當的時候建立使用者執行緒例項。
class NewThread extends Thread
{

public void run()
{

}
}
在需要建立NewThread這個執行緒的類或方法中,生成NewThread物件。

NewThread thread = new NewThread();
thread.start();

class NewThreadRun implements Runnable
{

public void run()
{

}
}
用下面的程式碼建立並執行新執行緒
NewThreadRun n = new NewThreadRun();
Thread thread = new Thread(n);
thread.start();
Runnable是java.long包中的一個介面。任何一個類都可以實現這個介面,從而實現建立和執行執行緒的功能。實現Runnable介面的類必須覆蓋介面中定義的run()方法,它仍然是完成具體任務的地方。
以上兩種方法都可以建立和執行執行緒,前一種方法要求一定是Thread類的子類,後一種方法可以不是Thread類的子類,但必須實現Runnable介面,這種方法使用更加靈活。
有時還只能使用後一種方法,如某類已經定義為Applet類的子類,由於Java不允許多重繼承,這時不能再定義它為Thread類的子類,此時只有宣告其實現Runnable介面來建立和執行新執行緒。