在两个线程使用相同的变量,但我不知道为什么他们不会在Java的更新(Using the same v

2019-10-21 01:56发布

我想说,我知道有这种类似的问题开始了。 我做了一些搜索,我也找了一些资料。 不幸的是,这些解决方案并没有帮助我。 我不知道为什么。 这就是为什么我问这个问题。

我有两个主题,我在Java中工作。 我有一个与此相关的四个类别。 第一类是在它的“主”方法的类。 它建立并启动所有的线程。 这里是我开始和申报主题:

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

我有麻烦的最后一堂课被称为“时机”。 我希望它能够改变,以便在邮件送达时控制布尔变量。 这里是:

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

我已经调查使用“挥发性”。 我没有找到工作。 我试着在“GlobalVariables”这样的声明变量的公共挥发性布尔进行;“。 我试图改变变量,但“DeliverMessage”类没有注册这种变化。 我也试图与“静态”做同样的事情。 这也不能工作。 变量似乎在“定时”级改变,但他们并不在“DeliverMessage”类链接到同一变量。

请让我知道我应该做的。 在此先感谢,〜录音棚

编辑:谢谢! 我有一对夫妇非常快澄清,但。 1)我声明布尔变量既是“静态”和“挥发”? 2)如何我指的是变量在“DeliverMessage”和“定时”班?

Answer 1:

你的两个班,定时和DeliverMessage各有GlobalVariables自己独特的实例,因此改变一个GlobalVariables的状态对象会对其他GlobalVariables对象没有影响。 如果你希望它们共享相同的GlobalVariables实例,然后他们相同的实例。

即,给他们俩一

public void setGlobalVariables(GlobalVariables global) {
   this.global = global;
}

方法,并传递相同GlobalVariables实例到两个定时和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实例传递到类的构造函数。



文章来源: Using the same variables in two threads, but I don't know why they won't update in Java