1、執行緒的狀態
2、建立和使用多執行緒
##3、執行緒同步
#4、同步集合
#執行緒的狀態
##執行緒有五種狀態:新建、就緒、執行、阻塞或結束。
新建:新建一個線程,線程進入新狀態;
就緒:呼叫線程的start()方法啟動線程後,進入就緒狀態;
運行:當得到CPU時間,執行緒從就緒態進入運行態,如果時間片完或呼叫yield()方法,運行態的執行緒可能進入就緒態;
阻斷:呼叫join()、sleep()、或wait ()方法,或等待I/O結束,執行緒處於阻塞態;
完成:當執行緒執行完run()方法,這個執行緒就結束。
建立並使用多執行緒#Thread的類別圖
1、繼承Thread類別來建立新執行緒
#2、實作Runnable
介面 #PrintChar實作了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多執行緒基礎詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!