java 執行緒 執行緒的通訊

2021-08-28 08:30:02 字數 1947 閱讀 8449

執行緒通訊的三種方式 同步

while 輪詢方式

wait() / notify() 方式

這裡講的同步是synchronized 關鍵字來實現執行緒間的通訊,我們用**來示範一下。

class obj

public synchronized void del()

}public class demo4

}}).start();

//執行緒2

new thread(new runnable()

}}).start();

//主線程

while(thread.activecount() > 1)

system.out.println("main:"+obj.count);

}}

我們來分析一下上面的**,執行緒1 和執行緒2 都是對obj 這個物件進行操作,當執行緒1 執行add()方法的時候拿到了obj 這個物件作為鎖,此時執行緒2 不能進行del()方法。當執行緒1 執行完了add()方法之後執行緒2 才能執行,這樣就實現了執行緒間的通訊。

這種方法本質上是共享變數式通訊,誰拿到了鎖誰就可以執行。

這種方式是兩個執行緒乙個執行緒不斷地改變條件,另乙個執行緒裡有乙個while 迴圈,不斷判斷條件,直到條件成立,開始執行執行其他的**塊,其實這就是多個執行緒同時執行,這中方式會犧牲部分cpu效能。

class obj

public synchronized void del()

}public class demo4

}}).start();

//執行緒2

new thread(new runnable()}}

}).start();;

}

上面的**中,當執行緒2 的條件不滿足時,它一直在進行無意義的迴圈。

這種方式有乙個經典的例子就是生產者—消費者模型,當倉庫貨物不足時,消費者就要等待,生產者生產足夠的貨物是給消費者傳送乙個訊息,消費者才可以繼續執行。同樣,當倉庫滿了之後生產者就需要停止一段時間,等到一部分貨物消費出去之後消費者傳送訊息給生產者,表示生產者可以繼續工作了。

class model 

public synchronized void produce(int val) catch (interruptedexception e)

}else

} public synchronized void consume(int val) catch (interruptedexception e)

}else

}public int get()

}public class demo8 catch (interruptedexception e)

model.produce(1000);}}

}).start();

/*** 消費者

*/new thread(new runnable() catch (interruptedexception e)

model.consume(2000);}}

}).start();

}}

執行結果:

容量不足-當前容量:1000

生產 1000-當前容量:2000

消費 2000-倉庫容量:0

生產 1000-當前容量:1000

容量不足-當前容量:1000

生產 1000-當前容量:2000

生產 1000-當前容量:3000

消費 2000-倉庫容量:1000

生產 1000-當前容量:2000

消費 2000-倉庫容量:0

生產 1000-當前容量:1000

容量不足-當前容量:1000

生產 1000-當前容量:2000

消費 2000-倉庫容量:0

java執行緒通訊

題目 子執行緒迴圈10次,接著主線程迴圈100,接著又回到子執行緒迴圈10次,接著再回到主線程又迴圈100,如此迴圈50次。public class traditionalthreadcommunicationtest start for int i 1 i 50 i static class bu...

Java 執行緒通訊

sychronized關鍵字 對方法使用該關鍵字,可以保證每次只有乙個執行緒獲取monitor的許可權,從而確保執行緒對共享資源操作的不會出現異常 wait wait 方法屬於object,有三個過載方法,該方法必須在sychronized方法或同步 塊中呼叫,呼叫該方法的執行緒會進入wait 對應...

Java執行緒通訊

假設現在系統中有兩個執行緒,分別代表取錢和存錢,現在假設系統有一種特殊的要求,系統要求存款者和取款者不斷重複訪問款,而且要求每當存款者將錢存入指定賬戶時,取錢者就立即取出該筆錢,不允許連續存款兩次,也不允許連續取款兩次 public class threadconnection class acco...