[英]Using the same variables in two threads, but I don't know why they won't update in Java
我想先说我知道有类似的问题。 我做了一些搜索,我发现了一些信息。 不幸的是,解决方案对我没有帮助。 我不知道为什么。 这就是我问这个问题的原因。
我有两个我正在使用Java的线程。 我有四个与此相关的课程。 第一个类是带有'main'方法的类。 它设置并启动所有线程。 这是我如何开始并声明线程:
Thread thread1 = new Thread(){
public void run(){
DeliverMessage deliverMess = new DeliverMessage();
deliverMess.deliver();
}
}
Thread thread2 = new Thread(){
public void run(){
Timing time = new Timing();
time.controlTime();
}
}
thread1.start();
thread2.start();
第二个类包含所有全局变量。 这个类叫做'GlobalVariables'。 GlobalVariables:
public class GlobalVariables(){
//Variables
public boolean proceed;
public boolean doubleCheck;
}
另一个名为“DeliverMessage”的类就是这样设置的。 这是我遇到问题的课程之一。 DeliverMessage:
public class DeliverMessage(){
//Variables
String mess1 = "Hello";
String mess2 = "How are you?";
String mess3 = "Goodbye";
//Setup
GlobalVariables global = new GlobalVariables();
public void deliver(){
while(true){
if(global.proceed){
System.out.println(mess1);
}
if(global.doubleCheck){
System.out.println(mess2);
System.out.println(mess3);
}
}
}
我遇到麻烦的最后一堂课叫做'Timing'。 我希望它能够更改布尔变量,以便控制何时传递消息。 这里是:
public class Timing(){
//Setup
GlobalVariables global = new GlobalVariables();
public void controlTime(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
global.proceed = true;
try {
TimeUnit.SECONDS.sleep(16);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
global.doubleCheck = true;
}
}
我已经研究过使用'volatile'了。 我没有发现那有效。 我尝试在'GlobalVariables'中声明变量,就像'public volatile boolean proceed;'一样。 我尝试更改变量,但'DeliverMessage'类没有注册该更改。 我也试过用'静态'做同样的事情。 那也行不通。 变量似乎在'Timing'类中发生了变化,但它们没有链接到'DeliverMessage'类中的SAME变量。
请告诉我应该怎么做。 提前谢谢,~Rane
编辑:谢谢! 我有几个非常快速的澄清。 1)我是否将布尔变量声明为'static'和'volatile'? 2)如何引用'DeliverMessage'和'Timing'类中的变量?
您的两个类Timing和DeliverMessage都有自己唯一的GlobalVariables实例,因此更改一个GlobalVariables对象的状态对其他GlobalVariables对象没有影响。 如果你希望它们共享相同的GlobalVariables实例,然后给他们相同的实例。
即,给他们两个
public void setGlobalVariables(GlobalVariables global) {
this.global = global;
}
方法并将相同的GlobalVariables实例传递给Timing和DeliverMessage类。
final GlobalVariables global = new GlobalVariables();
Thread thread1 = new Thread(){
public void run(){
DeliverMessage deliverMess = new DeliverMessage();
deliverMess.setGlobalVariables(global);
deliverMess.deliver();
}
}
Thread thread2 = new Thread(){
public void run(){
Timing time = new Timing();
time.setGlobalVariables(global);
time.controlTime();
}
}
thread1.start();
thread2.start();
是的,使GlobalVariables的布尔变量易变,但这仍然不是你的主要问题。
注意:另一个选项是将GlobalVariables实例传递给类构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.