24

我有一个线程,A其中有一个列表。List 包含一些对象。现在我想设计一个机制,我可以通过它向线程发送一些消息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 回答