リストがあるスレッド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
}
}
}
BlockingQueue
のメッセージオブジェクトを持つことができます。他のスレッドはメッセージをキューに入れます。 while(true)
ループの一部として、スレッドA
は poll
キューになり、到着したメッセージを処理します。
コードで:
_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
に送信できるようになりました。
単純なケースでは、インスタンス変数をスレッドAクラスに追加し、スレッドBにその値を設定して、スレッドAがキューをクリアする必要があることを示すことができます。より高度なケースでは、スレッドAとBの両方がアクセスできるメッセージのキューを使用できます。 Bはそこにメッセージを置き、Aはそれを読んで行動します。
すべての場合において、変数またはキューへのアクセスは、複数のスレッドアクセスに対して適切に保護する必要があります。
コードの他の場所で呼び出すことができるメソッドをクラス "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
}
}