2

リスナー インターフェイスを使用して、実行中の Thread の複数のインスタンスから情報を取得したいオブジェクト Foo があるとします。例えば

インターフェース:

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(..) が複数のスレッドによって同時に呼び出されます。フーはどうなるの?クラッシュするかどうか?

4

1 に答える 1

6
  • クラスFooには状態(フィールド)がないため、外部共有リソース(ファイルなど)を使用しない限り、スレッドセーフです
  • コンストラクターからスレッドを開始することは一般的に悪い考えですが、状態のないオブジェクトの場合は問題ないと思います
  • onNewData共有データにアクセスしない場合は期待どおりに機能しますが、アクセスする場合、結果はメソッドの実装方法によって異なります。
于 2012-10-19T11:55:12.230 に答える