gpt4 book ai didi

java - 在两个线程中使用相同的变量,但我不知道为什么它们不会在 Java 中更新

转载 作者:行者123 更新时间:2023-11-29 05:17:21 25 4
gpt4 key购买 nike

首先我想说我知道有类似的问题。我做了一些搜索,我确实找到了一些信息。不幸的是,这些解决方案对我没有帮助。我不知道为什么。这就是我问这个问题的原因。

我在 Java 中使用两个线程。我有四个与此相关的类(class)。第一类是其中包含“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”。全局变量:

public class GlobalVariables(){
//Variables
public boolean proceed;
public boolean doubleCheck;
}

另一个名为“DeliverMessage”的类是这样设置的。这是我遇到问题的类(class)之一。传递信息:

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

我遇到麻烦的最后一节课叫做“计时”。我希望它能够更改 boolean 变量以控制消息的传递时间。在这里:

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”类中的相同变量。

请告诉我应该怎么做。提前致谢, ~雷恩

编辑:谢谢!不过,我有几个非常快速的澄清。 1) 我是否将 boolean 变量声明为“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 的 boolean 变量可变,但这仍然不是您的主要问题。

注意:另一种选择是将 GlobalVariables 实例传递到您的类构造函数中。

关于java - 在两个线程中使用相同的变量,但我不知道为什么它们不会在 Java 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com