2011-08-02 167 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