24

リストのあるスレッドが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
        }
    }
}
4

3 に答える 3

42

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

于 2011-08-02T18:03:00.907 に答える
1

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

いずれの場合も、変数またはキューへのアクセスは、複数のスレッドにアクセスするために適切に保護する必要があります。

于 2011-08-02T18:05:55.847 に答える
1

コードの他の場所で呼び出すことができるクラス「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
  } 
}
于 2011-08-02T18:12:30.837 に答える