I學霸官方免費教程四十一 :Java基礎教程之線程死結

來源:互聯網
上載者:User

標籤:java多線程死結   後台線程   線程優先順序   同步死結   java線程應用   

線程死結是指兩個或兩個以上的線程在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死結狀態或系統產生了死結,這些永遠在互相等待的線程稱為死結線程。
例如:某一商店有兩個人PS和PB在做交易,PS手裡拿著貨物對PB說,你先給我錢我在給你貨,而PB拿著錢對PS說你先給我貨我在給你錢。兩個人就此僵持下去,永遠也無法做成交易,這就構成了死結。
執行個體:package thread.deadlock;/** * 建立DeadlockDemo類:用於測試死結 * @author 學霸聯盟 - 趙燦 */public class DeadlockDemo {public static void main(String[] args) {//建立一個Shop對象Shop shop = new Shop();//建立兩個線程對象ThreadBuy tBuy = new ThreadBuy(shop);ThreadSell tSell = new ThreadSell(shop);tBuy.start();tSell.start();}}/** * 建立Cargo(貨物)類:僅僅為了建立對象,擷取對象鎖 * @author 學霸聯盟 - 趙燦 */class Cargo{ }/** * 建立Money(貨物)類:僅僅為了建立對象,擷取對象鎖 * @author 學霸聯盟 - 趙燦 */class Money{ }/** * 建立Shop(商店)類 * @author 學霸聯盟 - 趙燦 */class Shop {//建立Cargo對象private Cargo cargo = new Cargo();//建立Money對象private Money money = new Money();//buyer方法完成買家想要的功能public void buyer() {//買家手裡拿著錢,對應到代碼上就是獲得money對象的鎖synchronized (money) {System.out.println("買家拿著錢說:先交貨");try {//類比等待賣家交貨的時間Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}//買家拿著錢的同時想要把貨也拿到手裡,再交出錢synchronized (cargo) {System.out.println("買家:成交");}}}//seller方法完成賣家想要的功能public void seller() {//賣家手裡拿著貨,對應到代碼上就是獲得cargo對象的鎖synchronized (cargo) {System.out.println("賣家拿著貨說:先交錢");try {//類比等待買家交錢的時間Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//賣家拿著貨的同時想要把錢也拿到手裡,再交出貨synchronized (money) {System.out.println("買家:成交");}}}}/** * 建立ThreadBuy類 * @author 學霸聯盟 - 趙燦 */class ThreadBuy extends Thread{private Shop  shop;public ThreadBuy(Shop shop){this.shop = shop;}@Overridepublic void run() {//購買的線程,執行購買的方法shop.buyer();}}/** * 建立ThreadSell類 * @author 學霸聯盟 - 趙燦 */class ThreadSell extends Thread{private Shop  shop;public ThreadSell(Shop shop){this.shop = shop;}@Overridepublic void run() {//賣出的線程,執行賣出的方法shop.seller();}}運行結果:賣家拿著貨說:先交錢買家拿著錢說:先交貨
死結導致交易永遠無法達成

線程優先順序線程優先順序的本意是用於標識線程獲得CPU的幾率的高低,但線程調度不是絕對按照優先順序的順序調度的,這與作業系統和JVM有關。
java中對線程的優先順序定義了10個層級,範圍:1(Thread.MIN_PRIORITY )~ 10 (Thread.MAX_PRIORITY )),但不同的系統有不同的線程優先順序的取值範圍,這樣就有可能多個線程優先順序對應某種作業系統裡有的同一優先順序,所以很多時候設定優先權看不到不同優先順序之間的差別。
自訂線程的優先順序預設是父線程類的優先順序
Thread類的預設優先順序是5(Thread.NORM_PRIORITY)
設定線程優先順序使用setPriority(int)方法

執行個體:package thread.priority;/** * 建立父線程 * @author 學霸聯盟 - 趙燦 */public class FatherThread extends Thread {// 聲明一個無參數的構造方法public FatherThread() {// 設定當前類對象的優先順序為8this.setPriority(8);}}package thread.priority;/** * 建立子線程 * @author 學霸聯盟 - 趙燦 */public class SonThread extends FatherThread {public static void main(String[] args) {// 建立SonThread對象,並使用建立的對象調用start方法啟動線程new SonThread().start();}@Overridepublic void run() {/* * 使用關鍵字this調用getPriority方法,擷取當前線程的優先順序 * 並通過輸出語句System.out.println將擷取到的優先順序輸出 */ System.out.println("子線程的優先順序:" + this.getPriority());}}運行結果:子線程的優先順序:8

後台線程在系統的後台運行,不與使用者直接互動;這樣的線程稱為後台線程(也稱服務線程或守護線程)。
例如:檔案下載
setDaemon();//將線程設定為後台線程


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

I學霸官方免費教程四十一 :Java基礎教程之線程死結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.