我有一个帖子,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
}
}
}
答案 0 :(得分:35)
您可以拥有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 :(得分: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
}
}
答案 2 :(得分:0)
在简单的情况下,您可以向线程A类添加一些实例变量,并让线程B设置其值以指示线程A必须清除其“队列”。在更高级的情况下,您可以使用线程A和B都可以访问的某些消息队列。 B会在那里发一条消息而A会阅读并采取行动。
在所有情况下,必须正确保护对变量或队列的访问以进行多线程访问。