[英]Threaded class variable not being set correctly
我有一個如下所示的線程類,該類應在m_bExit
設置為false時終止。 布爾值m_bMessageReceived
是在外部設置的。
public class CommsTimeout extends Thread {
public static boolean m_bMessageReceived = false;
public volatile boolean m_bExit = false;
private static long m_nStartTime;
public void run() {
while (!m_bExit) {
while ((System.currentTimeMillis() < (m_nStartTime + Constants.PERIOD))) {
// Wait...
}
if (!m_bMessageReceived) {
// Do stuff.
}
m_bMessageReceived = false;
}
}
public CommsTimeout() {
// Reset flags.
m_bMessageReceived = false;
m_bExit = false;
m_nStartTime = System.currentTimeMillis();
this.start();
}
}
CommsTimeout
類正在另一個類中初始化...
m_threadCommsTimeout = new CommsTimeout();
...並且每隔幾毫秒就在另一個類中設置m_bMessageReceived
:
CommsTimeout.m_bMessageReceived = true;
我的問題是,即使在超時時間內將m_bMessageReceived
設置為true
,仍會到達// Do stuff
行。 我錯過了什么? 謝謝!
這可能是可見性問題。 當將變量設置在另一個線程中時,不能保證您的線程會看到對m_bMessageReceived
的更改。 嘗試使m_bMessageReceived
volatile
。 這將確保您的線程將看到該變量的最新值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.