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