3 回答

TA貢獻1820條經驗 獲得超2個贊
在沒有使用同步手段的時候,當主線程對stopRequested作的修改時,不能確定backgroundThread什么時候能看到變量更改。
因為在代碼執行時,會將變量從內存加載到寄存器,如果沒有同步,如果另外一個線程(A)對變量的更改就無法刷新到另一個線程(B)中,因為B使用的是寄存器中的變量。如果使用了同步機制,比如synchonized,或者volitle,變量的更改就會立即同步,這樣訪問這個變量的多個線程就能理科看到了。
在這里,
剛開始執行時,backgroundThread將stopRequested從內存讀到寄存器
這里沒有使用同步手段,當main線程對stopRequested更新時,只是更新到內存,backgroundThread取到的還是寄存器中的值,所以不會停止。

TA貢獻2037條經驗 獲得超6個贊
通過查詢資料,確實和樓主說的環境有關系,樓主可以參考:
Does liveness failure that happened in concurrency exist in java 8main
方法結束了,其它非后臺線程不會停止運行(我把和junit
的Test
弄混了)

TA貢獻1797條經驗 獲得超4個贊
這段程序剛開始執行的時候是主線程線程先執行的,然后才是backgroundThread執行,由于給stopRequested變量賦值的時候,停了一秒,這個時候backgroundThread線程搶到了執行權,可能是這個原因吧 個人就建議 不對勿噴!??!
添加回答
舉報