2016-12-08 8 views
0

私は以下に示すスレッドクラスを持っています。これは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行はs到達するまで。私は何を逃したのですか?ありがとう!

+0

「Constants.PERIOD」とは何ですか? – SachinSarawgi

+0

これは5000に等しいので、whileループは5秒間反復します。 – petehallw

+2

m_bMessageReceivedをチェックした直後にfalseに設定していますので、whileの次の反復ではfalseになり、ループの反復がConstants.PERIODを超えない場合には "Do stuff"になります。 –

答えて

0

これは可視性の問題である可能性があります。変数が別のスレッドで設定されている場合、スレッドにm_bMessageReceivedへの変更が表示されるという保証はありません。 m_bMessageReceivedvolatileにしてみてください。これにより、スレッドに変数の最新の値が確実に表示されます。

関連する問題