首頁  >  文章  >  Java  >  Java多執行緒基礎詳解

Java多執行緒基礎詳解

迷茫
迷茫原創
2017-03-28 15:36:082189瀏覽

1、執行緒的狀態

2、建立和使用多執行緒

##3、執行緒同步

#4、同步集合

 

#執行緒的狀態

##執行緒有五種狀態:新建、就緒、執行、阻塞或結束。

新建:新建一個線程,線程進入新狀態;

就緒:呼叫線程的start()方法啟動線程後,進入就緒狀態;

運行:當得到CPU時間,執行緒從就緒態進入運行態,如果時間片完或呼叫yield()方法,運行態的執行緒可能進入就緒態;

阻斷:呼叫join()、sleep()、或wait ()方法,或等待I/O結束,執行緒處於阻塞態;

完成:當執行緒執行完run()方法,這個執行緒就結束。

 

建立並使用多執行緒#Thread的類別圖

 

1、繼承Thread類別來建立新執行緒

#2、實作Runnable

介面

,重寫run( )方法

#Print

Char實作了Runnable接口,並使用Thread創建線程,由於Thread類別實作了Runnable接口,所以可以創建這個類別的一個對象,並且調用它的start方法來啟動線程3、線程池

Java提供Executor接口來執行線程池中的任務,提供ExecutorService介面來管理和控制任務。

#執行緒同步 如果一個共享資源被多個執行緒同時訪問,可能會遭到破壞。例如資料域被先後修改的順序不同,則最後的值可能不確定。

競爭狀態:如果兩個或多個任務以一種會引起衝突的方式存取一個公共的資源,稱為競爭狀態

為了避免競爭狀態,應該防止多個執行緒同時進入程式的某一特定部分,程式中的這部分稱為臨界區。

1、利用加鎖同步

Java可以明確地採用鎖定和狀態來同步執行緒。一個鎖是一個Lock介面的實例,它定義了加鎖和釋放鎖的方法。

RenntrantLock是Lock的一個實現,用於創建相互排斥的鎖。可以創建特定公平策略的鎖定。公平策略值為1真,則確保等待時間最長的執行緒先獲得鎖定。為假,則給任意一個等待的線程。


2、執行緒協作

透過呼叫Lock物件的newCondition()方法而建立的對象,可以使用await(),signal()和signalAll()方法來實作執行緒之間的相互通訊。

當執行緒呼叫await()方法時,執行緒就進入等待狀態,等待喚醒的訊號。

3、阻塞佇列

可以對目前執行緒產生阻塞,如果一個執行緒從一個空的阻塞佇列中取元素,此時執行緒會被阻塞知道佇列中有了元素,被阻塞的佇列會被自動喚醒這樣提供了極大的方便性。

幾種阻塞佇列:

1:ArrayBlockingQueue使用陣列來實作阻塞佇列,必須指定一個容量或可選的公平策略來建構

2:LinkedBlockingQueue使用鍊錶來實作阻塞佇列。可以創造無邊界的或有邊界。
3:PriorityBlockQueue優先權佇列,依照元素的優先權對元素進行排序。

ArrayBlockingQueue資料域

#可以看出儲存空間為數組,並且有用到鎖定。

兩個重要方法的實作

 

當佇列滿時等待,不滿則進隊,此時用鎖定同步

佇列空時等待,不空時出隊。

 

阻塞佇列的應用

由例子可知,生產者往隊列放數,消費者從隊列取數,當隊列為空則等待,同步已在隊列中實現,無需使用鎖和條件。

 

3、信號量

信號量指對共同資源進行存取的物件。在存取資源之前,執行緒必須從信號量中取得許可。在訪問完資源之後,必須把許可證回傳給信號量。

程式建立了一個具有一個許可的信號量。當一個執行緒獲得許可,其他執行緒不能存取這個資源,直到先前的執行緒釋放該許可。

同步集合

Java集合框架中的類別不是執行緒安全的;也就是說,如果它們同時被多個執行緒存取和更新,它們的內容可能會被破壞,可以透過鎖定集合或同步集來保護合集中的資料

相關文章:

Java的實作得到,PUT,POST,刪除請求

詳細介紹Java程式設計常見問題總結

Java遠端通訊技術及原理分析的圖文介紹

#

以上是Java多執行緒基礎詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn