您好,登錄后才能下訂單哦!
本篇文章展示了java代碼實現線程通信的具體操作,代碼簡明扼要容易理解,如果在日常工作遇到這個疑問。希望大家通過這篇文章,找到解決疑問的辦法。
使用兩個線程打印1-100,交替打印
涉及到的方法:
wait()--一旦執行此方法,當前線程就進入阻塞狀態,并釋放同步監視器
notify()--一旦執行此方法,就會喚醒wait的一個線程,如果有多個線程wait,就喚醒優先級高的
notifyAll()---一旦執行此方法,會喚醒所有被wait的線程
說明:
(1)實現線程通信wait()\notify()\notifyAll()三個方法必須使用在同步代碼塊或同步方法中
(2)上述三個代碼的調用者必須是同步代碼塊或同步方法中的同步監視器
否則會出現異常java.lang.IllegalMonitorStateException
(3)wait()\notify()\notifyAll()在java.lang.Object類中
sleep()和wait()方法的異同
(1)相同點:一旦執行方法,都可以使當前線程進入阻塞狀態
(2)不同點:
a)兩個方法聲明的位置不同:Thread類中聲明sleep(),Object類中聲明wait()
b)調用的要求不一樣,sleep()可以在任何需要的場景調用,
wait()必須使用在同步代碼塊或同步方法中
c)關于是否釋放同步監視器:如果兩個方法都使用在同步代碼塊或同步方法中:
sleep()--不會釋放鎖,wait()會釋放鎖
d)sleep()時間到了,線程就被喚醒
wait()需要使用notify/notifyAll()來喚醒
public class CommunicationTest {
public static void main(String[] args) {
Number number=new Number();
Thread t1 = new Thread(number);
Thread t2 = new Thread(number);
t1.setName("線程1");
t2.setName("線程2");
t1.start();
t2.start();
}
class Number implements Runnable{
private int number=1;
private Object obj=new Object();
@Override
public void run() {
while(true){
// synchronized (this) {
synchronized (obj) {//調用notify的對象和同步監視器obj不是同一個對象,會出現異常
//加上obj.wait(),obj.notify()就對了
obj.notify();
if(number<=100){
System.out.println(Thread.currentThread().getName()+":"+number);
number++;
try {
//使得調用如下wait()方法的線程進入阻塞狀態
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
break;
}
}
}
}
}
釋放鎖的操作:
(1)當前線程的同步方法、同步代碼塊執行結束
(2)當前線程在同步代碼塊、同步方法中遇到break\return終止了該代碼塊,該方法繼續執行
(3)當前線程在同步代碼塊、同步方法中出現了未處理的Error/Exception,導致異常結束
(4)當前線程在同步代碼塊、同步方法中執行類線程對象的wait()方法,當前線程暫停,并釋放鎖
不會釋放鎖的操作:
(1)線程執行同步代碼塊、同步方法時,調用Thread.sleep()\Thread.yield()方法暫停當前線程的執行
(2)線程執行同步代碼塊時,其他線程調用了該線程的suspend()方法將該線程掛起,該線程不會釋放鎖(同步監 視器)--盡量避免使用suspend、resume控制線程
以上就是java代碼實現線程通信的詳細內容了,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業資訊!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。