Я хотел бы начать с того, что я знаю, что к этому относятся похожие вопросы. Я несколько раз искал, и я нашел некоторую информацию. К сожалению, решения мне не помогли. Я не знаю почему. Вот почему я задаю этот вопрос.
У меня две темы, с которыми я работаю в Java. У меня есть четыре класса, которые связаны с этим. Первый класс - это класс с основным методом. Он устанавливает и запускает все потоки. Вот как я начинаю и объявляю Threads:
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 continue". Я попытался изменить переменную, но класс "DeliverMessage" не зарегистрировал это изменение. Я также попытался сделать то же самое со статикой. Это тоже не сработало. Кажется, что переменные изменяются в классе "Timing", но они не ссылаются на SAME-переменные в классе "DeliverMessage".
Пожалуйста, дайте мне знать, что я должен делать. Спасибо заранее, ~ Rane
EDIT: Спасибо! Тем не менее, у меня есть пара очень быстрых разъяснений. 1) Объявляю ли я логические переменные как "статические", так и "изменчивые"? 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 в ваши конструкторы классов.