java - 将监听器与线程一起使用

标签 java multithreading thread-safety listener

假设我有一个对象 Foo,它希望使用监听器接口(interface)从线程的多个正在运行的实例中获得通知。例如

界面:

public interface ThreadListener {
   public void onNewData(String blabla);
}

Foo 类:

public class Foo implements ThreadListener {
   public Foo() {
      FooThread th1 = new FooThread();
      FooThread th2 = new FooThread();
      ...

      th1.addListener(this);
      th2.addListener(this);
      ...

      th1.start();
      th2.start();
      ...
   }

   @Override
   public void onNewData(String blabla) {
     ...
   }
}

主题:

public FooThread extends Thread {
   private ThreadListener listener = null;

   public void addListener(ThreadListener listener) {
      this.listener = listener;
   }

   private void informListener() {
      if (listener != null) {
         listener.onNewData("Hello from " + this.getName());
      }
   }

   @Override
   public void run() {
     super.run();

     while(true) {
        informListener();
     }
   }
}

在最坏的情况下,onNewData(..) 被多个线程同时调用。 Foo会发生什么?会不会崩溃?

最佳答案

  • 您的 Foo 类没有状态(字段),因此除非它使用外部共享资源(例如文件...),否则它是线程安全的
  • 从构造函数启动线程通常不是一个好主意,尽管在无状态对象的情况下,我认为这很好
  • 如果 onNewData 不访问共享数据,它将按预期工作;如果可以,结果将取决于方法的实现方式。

关于java - 将监听器与线程一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12973678/

相关文章:

java - 应用比例时不支持路径转换

Java在netbeans中添加第三方源库到项目中

java - 使用PrepareStatement对象从JTextField获取密码

java - 由于 OSX 中的其他线程,Platform.exit() 未结束 Javafx

c++ - 是否可以在 C++ 中新创建的线程中加入子线程?

java - Java线程ID在多个线程池中是否唯一?

java - 显示 DialogFragment 的应用程序在旋转后崩溃

c++ - 强制更新 Qt GUI

c - 检查全局变量线程安全保护的工具

ios - 分配包含在 Swift 字典中的元组的属性是否会改变字典本身?