[英]how to change the value of a static variable from a static method of another class
[英]change static variable through another class
我有一个静态变量问题,我有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的静态变量?
当您在Test3中编写时: Test2.bool = false;
,实际上您调用了另一个实例。
您的代码中有2个main
方法,因此您创建了2个不同的应用程序。
并确保标志不会改变。
您正在运行两个具有单独内存空间的不同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进程中运行,因此可以访问相同的内存区域。
这是两个不同的执行,您应该在同一执行中运行两个主要方法以保持Test2的值:
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
}
您的代码中有几个缺点,所以我将尝试给您一些提示。
通常,您想隐藏外部的内部字段,并通过getter / setter使其可用; 自从您编写了setBool
函数以来,将bool
设为private static
并添加了一个吸气剂:
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
或共享内存机制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.