在允许访问另一个线程拥有的对象的同时避免使用全局变量

时间:2019-06-27 16:50:24

标签: java multithreading swing concurrency object-oriented-analysis

我正在编写一个使用两个线程的Java程序,一个线程不断地在小部件的ArrayList上迭代并更新它们的状态,第二个线程是一个利用swing来基于小部件的状态为一系列块设置动画的线程。 / p>

我的问题是如何获取实现Runnable接口的Painter以查看WidgetManager拥有的小部件的数组列表?而且,这种模式天生就有缺陷吗?我被教导要避免使用全局变量(例如,在main中定义WidgetList),但据我了解,由于run()方法不需要依赖项注入,因此无法将引用传递给Runnable线程。

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 个答案:

答案 0 :(得分:2)

  

... 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);
  }
}