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

标签 java multithreading swing concurrency object-oriented-analysis

我正在编写一个 Java 程序,它使用两个线程,一个线程不断迭代小部件的 ArrayList 并更新其状态,第二个线程利用 swing 根据小部件的状态对一系列 block 进行动画处理。

我的问题是如何让实现 Runnable 接口(interface)的 Painter 查看 WidgetManager 拥有的小部件的数组列表?此外,这种模式本身就是错误的吗?我被教导要避免全局变量(例如在 main 中定义 WidgetList),但据我了解,无法传递对 Runnable 线程的引用,因为 run() 方法不需要依赖注入(inject)。

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
  }
}

最佳答案

...the run() method requires no [arguments]

run() 方法由接口(interface)定义。您可以使用任何实现(注意,不是扩展)接口(interface)的类的实例来创建线程。你的类可以有实例变量...

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

关于java - 避免使用全局变量,同时允许访问另一个线程拥有的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56795578/

相关文章:

java - 使用 @ManyToMany hibernate 并更新两种方式

java - JSTL1.2 根据TLD 或标签文件中的属性指令,属性var 不接受任何表达式

java - Spring和java中Environment对象初始化后如何调用方法?

c# - 多定时器 WPF 应用程序,调用线程必须是 STA 错误

java - Java Swing 中的线程不起作用

java - Android 使用证书建立 HTTPSConnection

Java Socket 线程服务器将消息发送回特定客户端

java - JList 渲染前/渲染后 Hook ?

java - 如何将 JScrollPane 添加到 JPanel

java - 想要在Java中确定自相交多边形的面积