現在我有兩個類,類A負責把發送標志位置為true,類B處于一直運行狀態(因為要不斷接收一些資訊),然后當send_flag為true時類B要發送訊息(這里我用列印陳述句表示)。下面是我給簡化后的邏輯關系。
class A{
public static volatile boolean send_flag = false;
public void change(){
send_flag = true;
}
}
class B{
public void listen(){
while(true){
if(A.send_flag){
System.out.println("Hello");
}
}
}
}
然后我先運行B,然后在A中改變send_flag的值,為什么B中send_flag值一直都是false,一直列印不出來。volatile不是可以讓變數具有可見性嗎?我學習java沒多久,還煩請各位學長學姐們指點一下。謝謝
uj5u.com熱心網友回復:
你開啟執行緒了嗎?你應該是在main函式中呼叫的吧,執行緒可見性是指,你在執行緒中改變了值,對另一個執行緒是可見的哪怕你不開啟兩條執行緒,你在main函式中也需要開啟另一個執行緒來呼叫B的監聽函式
uj5u.com熱心網友回復:
執行緒我在B中的main函式里開啟了,我寫的方法是在執行緒里運行的,忘記寫main了。
主要是想用A來改變B中的變數,然后讓B中正在運行著的執行緒獲取到flag的最新值。我在網上查了好多方法,好像都是改變完變數以后再啟動執行緒。不知道這個運行著的執行緒該怎么及時獲取新值。
uj5u.com熱心網友回復:
把你的執行緒呼叫的代碼也貼出來看看,光你列出的這些代碼來看沒問題uj5u.com熱心網友回復:
我的意思你應該在函式呼叫的時候單獨開啟另一個執行緒表示B的監聽執行緒,先呼叫監聽函式,讓改執行緒處于一個監聽狀態,然后呼叫A的方法修改該變數之后由于可見性,那么此刻B是能夠獲取到send_flag的最新值的轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/226488.html
標籤:Java相關
上一篇:關于stream的問題
