2011-08-02 207 views
20

我有一个线程,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

在Java中,您通常不会在线程之间发送消息,而是使用同步对象在线程之间传递值。 – toto2

+0

我在我的新编辑中同步实例变量,是否会起作用? – akshay

+1

@akshay你编辑看起来OK(除非你的意思是'if(getFlag()== true)')。 – toto2

回答

32

你可以有一个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

+0

队列是线程A的一个实例变量。现在如果线程B在线程A正在检索它的时候会添加一些值,那么它不会是一个问题吗? – akshay

+1

@akshay:(1)'queue'不一定是'A'的成员(我简单地做了一个例子); (2)'BlockingQueue'是线程安全的,所以无论哪种方式都不会有问题。 – NPE

+0

:我的新编辑能够解决问题吗?????????? – akshay

0

在一个简单的情况下,你可以添加一些实例变量给线程A类,让线程B设置它的值来表明线程A必须清除它的队列。在更高级的情况下,您可以使用线程A和B都可以访问的一些消息队列。 B会在那里发布消息,A会阅读并采取行动。

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

0

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

会导致问题。因为我的循环大量使用objs,如果它突然清除,将导致问题 – akshay

+0

您的问题与您如何向线程A发送消息有关,因此它可以执行所需的操作。我的回应直接针对这一点。没有进入线程安全,因为我认为在清除或读取任何内容之前,您将在代码中进行适当的检查(同步)。 – Garvin