程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java多線程問題及處理筆記

Java多線程問題及處理筆記

編輯:關於JAVA

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;
/**

  * 測試線程優先級

* author by http://www.bt285.cn http://www.5a520.cn

  */

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

普通優先級:0

高優先級:3

普通優先級:1

高優先級:4

普通優先級:2

高優先級:5

高優先級:6

高優先級:7

高優先級:8

高優先級:9

普通優先級:3

普通優先級:4

普通優先級:5

普通優先級:6

普通優先級:7

普通優先級:8

普通優先級:9

低優先級:0

低優先級:1

低優先級:2

低優先級:3

低優先級:4

低優先級:5

低優先級:6

低優先級:7

低優先級:8

低優先級:9

在該示例程序,PrintNumberThread線程實現的功能是輸出數字,每次數字輸 出之間沒有設置時間延遲,在測試類TestPriority中創建三個 PrintNumberThread類型的線程對象,然後分別設置線程優先級是最高、普通和 最低,接著啟動線程執行程序。從執行結果可以看出高優先級的線程獲得了更多 的執行時間,首先執行完成,而低優先級的線程由於優先級較低,所以最後一個 執行結束。

其實,對於線程優先級的管理主要由系統的線程調度實現,較高優先級的線 程優先執行,所以可以通過設置線程的優先級影響線程的執行。

3 總結

關於多線程的基礎知識就介紹這麼多,在本章中介紹了線程的概念、線程的 實現方式以及使用多線程時會遇到的問題以及解決辦法,而需要建立多線程的概 念,也就是並發編程的概念還需要進行比較多的練習,理解多線程的概念並熟悉 多線程的編程。

而關於多線程編程的高級知識,如線程組等則可以在熟悉了線程的基本概念 以後再進行更加深入的學習。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved