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