使用带有线程的监听器

Yan*_*ald 2 java multithreading listener thread-safety

假设我有一个Object Foo,希望通过使用侦听器接口的几个正在运行的Thread实例获得通知.例如

界面:

public interface ThreadListener {
   public void onNewData(String blabla);
}
Run Code Online (Sandbox Code Playgroud)

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) {
     ...
   }
}
Run Code Online (Sandbox Code Playgroud)

线程:

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();
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

ass*_*ias 6

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

  • @YannickWald http://stackoverflow.com/search?tab=relevance&q=[java]%20%2bstart%20%2bthread%20%2bconstructor (2认同)