Общение между двумя потоками - PullRequest
22 голосов
/ 02 августа 2011

У меня есть тема, 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
        }
    }
}

Ответы [ 3 ]

35 голосов
/ 02 августа 2011

Вы можете иметь 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.

1 голос
/ 02 августа 2011

Вы должны иметь возможность добавить метод к классу "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
  } 
}
0 голосов
/ 02 августа 2011

В упрощенном случае вы можете добавить некоторую переменную экземпляра в класс потока A, и поток B установит его значение, чтобы указать, что поток A должен очистить свои очереди. В более сложном случае вы можете использовать некоторую очередь сообщений, к которой могут обращаться оба потока A и B. B помещал туда сообщение, а A читал и действовал на нем.

Во всех случаях доступ к переменной или очереди должен быть должным образом защищен для доступа нескольких потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...