Подтвердить что ты не робот

Общение между двумя потоками

У меня есть поток, 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.
        }
    }
}

EDIT: Могу ли я сделать это так?

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
        }
    }
}
4b9b3361

Ответ 1

У вас может быть 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.

Ответ 2

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

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

Ответ 3

Вы должны иметь возможность добавить метод в класс "А", который можно назвать в другом месте вашего кода. Просто сохраните ссылку на свой экземпляр класса "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
  } 
}