Java程式設計那些事兒100 多執行緒問題及處理3

2021-04-28 18:28:52 字數 2993 閱讀 5153

多執行緒程式設計在實際的網路程式開發中,在客戶端程式實現中使用的比較簡單,但是在伺服器端程式實現中卻不僅是大量使用,而且會出現比客戶端更多的問題。

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

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

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

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

在日常生活中,例如火車售票視窗等經常可以看到「

*** 優先」,那麼多執行緒程式設計中每個執行緒是否也可以設定優先順序呢?

在多執行緒程式設計中,支援為每個執行緒設定優先順序。優先順序高的執行緒在排隊執行時會獲得更多的

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

} package priority;

/** *

輸出數字的執行緒 */

public class printnumberthread extends thread

public void run()

}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

型別的執行緒物件,然後分別設定執行緒優先順序是最高、普通和最低,接著啟動執行緒執行程式。從執行結果可以看出高優先順序的執行緒獲得了更多的執行時間,首先執行完成,而低優先順序的執行緒由於優先順序較低,所以最後乙個執行結束。

其實,對於執行緒優先順序的管理主要由系統的執行緒排程實現,較高優先順序的執行緒優先執行,所以可以通過設定執行緒的優先順序影響執行緒的執行。

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

而關於多執行緒程式設計的高階知識,如執行緒組等則可以在熟悉了執行緒的基本概念以後再進行更加深入的學習。

1 、分別使用多執行緒的

3 種實現方法,實現乙個列印奇數的執行緒 2

、分別使用多執行緒的

3 種實現方法,實現乙個列印

1-10000

之間素數

( 質數

) 的執行緒 3

、在練習

1 、練習

2 的基礎上,加入控制台輸入,當執行緒執行時,輸入

quit

或exit

結束執行緒和程式的執行。 4

、實現兩個執行緒,乙個列印奇數,乙個列印偶數,每個執行緒的延遲時間不一樣,實現奇數和偶數的交替列印。 5

、模擬火車票聯網售票系統:多個執行緒同時出票,保證每張出票的編號連續且不重複。

Java程式設計那些事兒 如何學好程式設計

俗話說 興趣是最好的老師 但是只靠興趣是遠遠不夠的,還需要付出艱辛的努力。程式設計是一種技能,需要在較短的時間內學會,就不能像學習漢語一樣,通過十幾年甚至更長的時間來學好,也不能像英語那樣進行業餘學習,以至很多大學畢業的人英語水平也不敢恭維,也達不到實用的程度。那麼如何學好程式設計呢?或者更現實一點...

程式語言那些事兒

開發工具 入門 c 初級開發師 基本資料型別 引用資料型別 常量 變數 表示式 運算子 順序 分支 迴圈 i oc 中級開發師 命名空間 程式設計思想 量化你的思維 流程圖 偽 功能劃分 模組劃分 db設計 sys設計 函式思想 重用 i o 重構 物件導向的思想 物件陣列 物件指標 友元函式和友元...

Java程式設計那些事兒36 do while語句語法

5.4.2 do while語句 do while語句由關鍵字do和while組成,是迴圈語句中最典型的 先迴圈再判斷 的流程控制結構,這個和其它2個迴圈語句都不相同。do while語句的語法格式為 dowhile 迴圈條件 語法說明 在do while語句中,迴圈體部分是重複執行的 部分,迴圈條...