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 的循环但它不起作用。

如何通过 Test3 更改 Test2 的静态变量?

4

5 回答 5

8

当您在 Test3: 中编写时Test2.bool = false;,实际上您调用了另一个实例。

您的代码中有 2 个main方法,因此您创建了 2 个不同的应用程序。

并确保标志不会改变。

于 2013-09-17T06:47:24.323 回答
1

您正在运行两个具有不同内存空间的不同 java 进程。这意味着您的类被加载到单独的内存区域中,每个 jvm 进程一个。因此,当您从 Test3 示例访问 Test2.bool 时,您实际上指的是与您的 Test2 示例不同的内存区域。

我怀疑你在这里注意到的是两个独立的线程:

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 回答
0

这是两个不同的执行,您应该在同一个执行中运行两个主要方法以保持 Test2 布尔值:

public class Test3 {

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

}
于 2013-09-17T06:48:50.333 回答
0

我认为你可以创建 shareClass

class shareMe {
   public static static boolean bool; 
}

class some1 {
     //USE THE ABOVE VARIABLE BY shareMe CLASS NAME
}
class some2 {
     //USE THE ABOVE VARIABLE BY shareMe CLASS NAME
}
于 2013-09-17T06:50:14.333 回答
0

你的代码有几个缺点,所以我会试着给你一些提示。

通常你想对外部世界隐藏内部字段,并通过 getter/setter 使它们可用;既然你写了这个setBool函数,就让它bool成为private static并添加一个getter:

private static boolean bool;

public static boolean getBool(){
    return bool;
}
public static void setBool(boolean temp){
    bool = temp;
}
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++;
    }
}

根据您的项目,您可能希望使用并发并在您的类Threads之间Test2以及Test3是否在同一应用程序中运行时进行通信。如果不是这样,那么您应该使用Sockets或共享内存机制。

于 2013-09-17T07:50:06.437 回答