繁体   English   中英

在两个线程之间进行通信

[英]Communicating between two threads

我有一个帖子, A有一个列表。 List包含一些对象。 现在我想设计一个mechanisim,通过它我可以向线程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)循环的一部分,线程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发送消息。

您应该能够在类“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
  } 
}

在一个简单的情况下,您可以向线程A类添加一些实例变量,并让线程B设置其值以指示线程A必须清除其“队列”。 在更高级的情况下,您可以使用线程A和B都可以访问的某些消息队列。 B会在那里发一条消息而A会阅读并采取行动。

在所有情况下,必须正确保护对变量或队列的访问以进行多线程访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM