web-dev-qa-db-ja.com

2つのスレッド間の通信

リストがあるスレッドAがあります。リストはいくつかのオブジェクトを保持しています。次に、メッセージをスレッドAに送信できるメカニズムを設計します。

Thread Aループで実行されます(待機もスリープもしません)。他のいくつかのスレッドBは、いくつかのメッセージをスレッドAに送信し、スレッドAはすべてのキューを空にします。

スレッド間でメッセージを送信するにはどうすればよいですか?

class A extends Thread {
    List<Object> objs = something; //Init it
    void run() {
        while(true) {
            //Body which works on objects.
            //After receiving an external message, "A" should perform some action, for example, empty objects.
        }
    }
}

編集:私はこのようにできますか?

class A extends Thread {
    List<Object> objs = something; //Init it
    Boolean flag = false;

    public void setFlag(boolean value) {
        synchronized(flag) {
            this.flag = value;
        }
    }

    public void getFlag() {
        synchronized(flag) {
            return this.flag;
        }
    }

    void run() {
        while(true) {
            //Body which works on objects.
            //After receiving an external message, A should perform some action, for example, empty objects.
            if (getFlag == true)
                //Empty list
        }
    }
}
23
akshay

BlockingQueue のメッセージオブジェクトを持つことができます。他のスレッドはメッセージをキューに入れます。 while(true)ループの一部として、スレッドApoll キューになり、到着したメッセージを処理します。

コードで:

_class A extends Thread{
 List<Object>  objs = something ;//init it
 BlockingQueue<Message> queue = new LinkedBlockingQueue<Message>();
 void run(){
     while(true){
       Message msg;
       while ((msg = queue.poll()) != null) {
         // process msg
       }
       // do other stuff
     }
   }
}
_

他のスレッドがqueue.put()を呼び出して、メッセージをスレッドAに送信できるようになりました。

36
NPE

単純なケースでは、インスタンス変数をスレッドAクラスに追加し、スレッドBにその値を設定して、スレッドAがキューをクリアする必要があることを示すことができます。より高度なケースでは、スレッドAとBの両方がアクセスできるメッセージのキューを使用できます。 Bはそこにメッセージを置き、Aはそれを読んで行動します。

すべての場合において、変数またはキューへのアクセスは、複数のスレッドアクセスに対して適切に保護する必要があります。

1
Alex Gitelman

コードの他の場所で呼び出すことができるメソッドをクラス "A"に追加できるはずです。クラス "A"のインスタンスへの参照をアクセス可能な場所に保管してください。

class A extends Thread{
 List<Object>  objs = something ;//init it
 void run(){
   while(true){
       //body which works on objs
       //open receiving external message A should perform some action ie empty objs
     }
   }
  void ChangeState()
  {
     //clear objs
  } 
}
1
Garvin