2017-10-29 7 views
-4

ブール値が正しく更新されないのはなぜですか?Java - ブール値が正しく更新されない

public class Declarations { 

    public static List<Future<?>> futures = new ArrayList<>(); //it is filled by FutureTasks (about 10) 
    public static Boolean ready = true; 

} 

private class Stop { 

    private void stop() { 
     Declarations.ready = false; 
     for(Future<?> f : futures) { 
      f.cancel(true); 
     } 
    } 

} 

private class FutureTask implements Runnable { 

    @Override 
    public void run() { 
     try { 
      (...) 
     } catch (Exception ex) { 
      if(ready) { 
       System.out.println("Exception!"); 
      } 
     } 
    } 

} 

Stopクラスからstop()を実行すると、「例外」が発生します。出力に表示されます。 WHY?私は準備ブール値を変更しているので、ここで何が起こっているのですか?

+3

1.実行とテストをコンパイルできる有効な[mcve]コードを作成して投稿してください。 2.「揮発性」と表示されるべきではありませんか? –

+0

私は変数volatileを作りました。私はDeclarations.ready = falseであると確信しています。 –

+0

まだあなたはあなたのMCVEをまだ投稿していないので、もしあなたの問題を解決していなければ、私たちがあなたを助けることは不可能ではないにしても、難しいことです。 。 –

答えて

3

readyは揮発性ではないため、1つのスレッドで変更された内容は他のスレッドでと表示されることはありません。

volatileにしてみてください。

同期の一部のマニュアル:https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.1

+0

変更されていて、それでも同じです –

0

あなたは全体のコードを提供していなかったので、何が起こっているかを理解するのは難しいです。

「Declarations.ready = false;」の後にコードをデバッグするか、またはプリントアウトを追加することをお勧めします。それが実行されているかどうかを理解する。

また、単一のスレッドで実行されているのか、複数のスレッドで並列に実行されているのかは不明です。

+0

私はSystem .out.println(準備完了);それを虚偽にする直前であり、それはまだ同じです。私は準備ができていることを意味する –

関連する問題