Предотвращение использования глобальной переменной при одновременном разрешении доступа к объекту, принадлежащему другому потоку - PullRequest
1 голос
/ 27 июня 2019

Я пишу Java-программу, которая использует два потока, один из которых постоянно перебирает ArrayList виджетов и обновляет их состояния, второй - поток, использующий свинг для анимации серии блоков на основе состояния виджетов.

Мой вопрос: как я могу заставить Painter, который реализует интерфейс Runnable, видеть список виджетов, которым владеет WidgetManager?Кроме того, эта модель по своей сути неисправна?Меня учили избегать глобальной переменной (например, вместо определения WidgetList в main), но, насколько я понимаю, нет способа передать ссылку на поток Runnable, потому что метод run () не требует внедрения зависимостей.

main{
  WidgetManager wm;
  Painter painter;
  painter.run();
  wm.updateWidgets();
}

public class WidgetManager{
  volatile ArrayList<Widget> widgets;

  void updateWidgets(){
    while(true){
      //do some stuff
    }
  }
}

public class Painter implements Runnable{
  public void run(){
    //paint some stuff
  }
}

1 Ответ

2 голосов
/ 27 июня 2019

... метод run() не требует [аргументов]

Метод run() определяется interface.Вы можете создать свой поток, используя экземпляр любого класса, который implements (обратите внимание, не extends) интерфейс.Ваш класс может иметь переменные экземпляра ...

public class Painter implements Runnable{
  private ArrayList<Widget> widgets;
  public Painter(ArrayList<Widget> widgets) {
      this.widgets = widgets;
  }
  public void run(){
     paintSomeStuffBasedOnContentOf(widgets);
  }
}
...