執行緒通訊的三種方式 同步
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...