熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java多線程問題及處理(筆記)

2013-11-23 19:48:55  來源: Java高級技術 

  死鎖

  多線程編程在實際的網絡程序開發中在客戶端程序實現中使用的比較簡單但是在服務器端程序實現中卻不僅是大量使用而且會出現比客戶端更多的問題

  另外一個容易在服務器端出現的多線程問題是——死鎖死鎖指兩個或兩個以上的線程為了使用某個臨界資源而無限制的等待下去還是以前面衛生間的例子來說明死鎖例如兩個人都同時到達衛生間而且兩個人都比較禮貌第一個人和第二個人說你先吧第二個人和第一個人說你先吧這兩個人就這樣一直在互相禮讓誰也不進入這種現象就是死鎖這裡的兩個人就好比是線程而衛生間在這裡就是臨界資源而由於這兩個線程在一直謙讓誰也不使用臨界資源

  死鎖不僅使程序無法達到預期實現的功能而且浪費系統的資源所以在服務器端程序中危害比較大在實際的服務器端程序開發中需要注意避免死鎖

  而死鎖的檢測比較麻煩而且不一定每次都出現這就需要在測試服務器端程序時有足夠的耐心仔細觀察程序執行時的性能檢測如果發現執行的性能顯著降低則很可能是發生了死鎖然後再具體的查找死鎖出現的原因並解決死鎖的問題

  死鎖出現的最本質原因還是邏輯處理不夠嚴謹在考慮時不是很周全所以一般需要修改程序邏輯才能夠很好的解決死鎖

   線程優先級

  在日常生活中例如火車售票窗口等經常可以看到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 ;

  */

  public class TestPriority {

  public static void main(String[] args) {

  PrintNumberThread p = new PrintNumberThread(高優先級);

  PrintNumberThread p = new PrintNumberThread(普通優先級);

  PrintNumberThread p = new PrintNumberThread(低優先級);

  psetPriority(ThreadMAX_PRIORITY);

  psetPriority(ThreadNORM_PRIORITY);

  psetPriority(ThreadMIN_PRIORITY);

  pstart();

  pstart();

  pstart();

  }

  }

  package priority;

  /**

  * 輸出數字的線程

  */

  public class PrintNumberThread extends Thread {

  String name;

  public PrintNumberThread(String name){

  thisname = name;

  }

  public void run(){

  try{

  for(int i = ;i < ;i++){

  Systemoutprintln(name + : + i);

  }

  }catch(Exception e){}

  }

  }

  程序的一種執行結果為

  高優先級

  高優先級

  高優先級

  普通優先級

  高優先級

  普通優先級

  高優先級

  普通優先級

  高優先級

  高優先級

  高優先級

  高優先級

  高優先級

  普通優先級

  普通優先級

  普通優先級

  普通優先級

  普通優先級

  普通優先級

  普通優先級

  低優先級

  低優先級

  低優先級

  低優先級

  低優先級

  低優先級

  低優先級

  低優先級

  低優先級

  低優先級

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

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

   總結

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

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


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27491.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.