1.死鎖
多線程編程在實際的網絡程序開發中,在客戶端程序實現中使用的比較簡單,但是在服務器端程序實現中卻不僅是大量使用,而且會出現比客戶端更多的問題。
另外一個容易在服務器端出現的多線程問題是——死鎖。死鎖指兩個或兩個以上的線程為了使用某個臨界資源而無限制的等待下去。還是以前面衛生間的例子來說明死鎖,例如兩個人都同時到達衛生間,而且兩個人都比較禮貌,第一個人和第二個人說:你先吧,第二個人和第一個人說:你先吧。這兩個人就這樣一直在互相禮讓,誰也不進入,這種現象就是死鎖。這裡的兩個人就好比是線程,而衛生間在這裡就是臨界資源,而由於這兩個線程在一直謙讓,誰也不使用臨界資源。
死鎖不僅使程序無法達到預期實現的功能,而且浪費系統的資源,所以在服務器端程序中危害比較大,在實際的服務器端程序開發中,需要注意避免死鎖。
而死鎖的檢測比較麻煩,而且不一定每次都出現,這就需要在測試服務器端程序時,有足夠的耐心,仔細觀察程序執行時的性能檢測,如果發現執行的性能顯著降低,則很可能是發生了死鎖,然後再具體的查找死鎖出現的原因,並解決死鎖的問題。
死鎖出現的最本質原因還是邏輯處理不夠嚴謹,在考慮時不是很周全,所以一般需要修改程序邏輯才能夠很好的解決死鎖。
2. 線程優先級
在日常生活中,例如火車售票窗口等經常可以看到“XXX優先”,那麼多線程編程中每個線程是否也可以設置優先級呢?
在多線程編程中,支持為每個線程設置優先級。優先級高的線程在排隊執行時會獲得更多的CPU執行時間,得到更快的響應。在實際程序中,可以根據邏輯的需要,將需要得到及時處理的線程設置成較高的優先級,而把對時間要求不高的線程設置成比較低的優先級。
在Thread類中,總計規定了三個優先級,分別為:
l MAX_PRIORITY——最高優先級
l NORM_PRIORITY——普通優先級,也是默認優先級
l MIN_PRIORITY——最低優先級
在前面創建的線程對象中,由於沒有設置線程的優先級,則線程默認的優先級是NORM_PRIORITY,在實際使用時,也可以根據需要使用Thread類中的setPriority方法設置線程的優先級,該方法的聲明為:
public final void setPriority(int newPriority)
假設t是一個初始化過的線程對象,需要設置t的優先級為最高,則實現的代碼為:
t. setPriority(Thread. MAX_PRIORITY);
這樣,在該線程執行時將獲得更多的執行機會,也就是優先執行。如果由於安全等原因,不允許設置線程的優先級,則會拋出SecurityException異常。
下面使用一個簡單的輸出數字的線程演示線程優先級的使用,實現的示例代碼如下:
package priority;
/**
* 測試線程優先級
*/
public class TestPriority {
public static void main(String[] args) {
PrintNumberThread p1 = new PrintNumberThread("高優先級");
PrintNumberThread p2 = new PrintNumberThread("普通優先級");
PrintNumberThread p3 = new PrintNumberThread("低優先級");
p1.setPriority(Thread.MAX_PRIORITY);
p2.setPriority(Thread.NORM_PRIORITY);
p3.setPriority(Thread.MIN_PRIORITY);
p1.start();
p2.start();
p3.start();
}
}
package priority;
/**
* 輸出數字的線程
*/
public class PrintNumberThread extends Thread {
String name;
public PrintNumberThread(String name){
this.name = name;
}
public void run(){
try{
for(int i = 0;i < 10;i++){
System.out.println(name + ":" + i);
}
}catch(Exception e){}
}
}
程序的一種執行結果為:
高優先級:0
[1] [2] 下一頁