簡體   English   中英

在兩個線程中使用相同的變量,但我不知道為什么它們不會在Java中更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM