1

私は2つのクラスを持っている静的変数に問題があります:

public class Test2 {

    public static boolean bool;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        bool = true;
        int run=0;
        while (bool==true) {
            System.out.println("Test 2 "+run);
            System.out.println(bool);
            run++;
        }
    }
    public static void setBool(boolean temp){
        bool = temp;
    }
}

public class Test3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test2.bool = false;

    }

}

問題は、Test2 を実行してループを実行し、次に Test3 を実行して Test2 のループを終了させたときですが、動作しません。

Test2 から Test3 までの静的変数を変更するにはどうすればよいですか?

4

5 に答える 5

1

別々のメモリ空間で 2 つの異なる Java プロセスを実行しています。これは、クラスが、jvm プロセスごとに 1 つずつ、別々のメモリ領域にロードされることを意味します。したがって、Test3 の例から Test2.bool にアクセスする場合、実際には Test2 の例とは異なるメモリ領域を参照しています。

ここで気をつけているのは、2 つの別々のスレッドであると思われます。

class ThreadA extends Thread {

  private final boolean running = true;

  public void run() {
    while(running) {
      doStuff();
    }
  }

  public void kill() {
    running = false
  }

  private void doStuff() {
    // do some interesting stuff
  }
}

class ThreadB extends Thread {

  private ThreadA thread;

  public ThreadB(ThreadA aThread) {
    thread = aThread;
  }

  public void run() {
    // on some condition
    thread.kill();
  }
}

class Runner {
  public static void main(String[] args) {
    ThreadA t1 = new ThreadA();
    ThreadB t2 = new ThreadB(t1);
    t1.start();
    t2.start();
  }
}

マルチプロセッサ環境での適切な可視性を保証するために、ブール変数を final として宣言していることを確認してください。

両方のスレッドが同じ jvm プロセスで実行されるため、同じメモリ領域にアクセスできます。

于 2013-09-17T07:18:01.530 に答える