Использование одинаковых переменных в двух потоках, но я не знаю, почему они не будут обновляться в Java

1

Я хотел бы начать с того, что я знаю, что к этому относятся похожие вопросы. Я несколько раз искал, и я нашел некоторую информацию. К сожалению, решения мне не помогли. Я не знаю почему. Вот почему я задаю этот вопрос.

У меня две темы, с которыми я работаю в 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"?

Теги:
multithreading
static
volatile

1 ответ

3
Лучший ответ

Каждый из ваших двух классов, 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 в ваши конструкторы классов.

  • 0
    Объявляю ли я булевы переменные как «статические» и «изменчивые»? Кроме того, как я могу обратиться к переменным в классе 'GlobalVariables'?
  • 1
    @Rane: если вы сделаете переменные статичными, щенок где-нибудь погибнет, так что, пожалуйста, просто не делайте этого. Для установки и доступа к ним используйте геттеры и сеттеры.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню