Java 通过另一个类更改静态变量

Java 通过另一个类更改静态变量,java,jakarta-ee,Java,Jakarta Ee,我对静态变量有问题 我有两门课: 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

我对静态变量有问题 我有两门课:

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;
    }
}

问题是当我运行Test2来执行循环,然后运行Test3来终止Test2的循环,但它不起作用

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

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

代码中有两个主要方法,因此创建了两个不同的应用程序

并确保标记不会更改。

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

代码中有两个主要方法,因此创建了两个不同的应用程序


并且确保标志不会更改。

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

public class Test3 {

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

}

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

public class Test3 {

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

}

我认为您可以创建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
}

我认为您可以创建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
}

您正在使用单独的内存空间运行两个不同的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进程中运行,因此可以访问同一内存区域。

您正在运行两个具有不同内存空间的不同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进程中运行,因此可以访问相同的内存区域。

您的代码中有几个缺点,因此我将尝试给您一些提示

通常,您希望对外部世界隐藏内部字段,并通过getter/setter使其可用;由于您编写了setBool函数,因此将bool设置为私有静态,并添加一个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++;
    }
}

根据您的项目,如果您的类在同一个应用程序中运行,您可能希望使用并发性和线程在Test2和Test3之间进行通信。如果不是这样,那么您应该使用套接字或共享内存机制。

您的代码中有几个缺点,因此我将尝试给您一些提示

通常,您希望对外部世界隐藏内部字段,并通过getter/setter使其可用;由于您编写了setBool函数,因此将bool设置为私有静态,并添加一个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++;
    }
}


根据您的项目,如果您的类在同一个应用程序中运行,您可能希望使用并发性和线程在Test2和Test3之间进行通信。如果不是这样,那么应该使用套接字或共享内存机制。

另一个实例?对不起,我不能理解。@PrasadKharkar你不理解的是什么?instance这个词?@Fildor,它是否意味着JVM运行有两种指令?我不确定,因为在工作实例中,我考虑的是非静态的东西。@PrasadKharkar是的,如果启动两个主要方法,将有两个JVM实例。另一个实例?对不起,我不能理解。@PrasadKharkar你不理解的是什么?instance这个词?@Fildor,它是否意味着JVM运行有两种指令?我不确定,因为对于工作实例,我考虑的是非静态的东西。@PrasadKharkar是的,如果启动两个主要方法,就会有两个JVM实例。它们在两个不同的VM中运行。因此,您不仅在不同的实例上调用Test2.bool=false,而且在不同的机器上也调用Test2.bool=false。因此,您不仅在不同的实例上调用Test2.bool=false,而且在不同的机器上也调用Test2.bool=false。为什么使用两个main不会有帮助。它们仍然会在两个不同的上下文中运行。啊,好的。所以你会建议他从一个主要方法中调用这些东西。你应该说清楚。是的@Fildor是真的,所以我想你为什么不通过创建不同的函数而不是2个主函数来使用相同的主上下文。好的。我想补充一点,op仍然需要在一个单独的线程中运行Test2中的内容。否则他会陷入一个无限循环,这没用。它们仍然会在两个不同的上下文中运行。啊,好的。那么你会苏
建议他从一个主要方法中调用这些东西。你应该说清楚。是的@Fildor是真的,所以我想你为什么不通过创建不同的函数而不是2个主函数来使用相同的主上下文。好的。我想补充一点,op仍然需要在一个单独的线程中运行Test2中的内容。否则他会陷入无限循环。