簡體   English   中英

在兩個線程之間進行通信

[英]Communicating between two threads

我有一個帖子, 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
        }
    }
}

你可以有一個消息對象的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發送消息。

您應該能夠在類“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
  } 
}

在一個簡單的情況下,您可以向線程A類添加一些實例變量,並讓線程B設置其值以指示線程A必須清除其“隊列”。 在更高級的情況下,您可以使用線程A和B都可以訪問的某些消息隊列。 B會在那里發一條消息而A會閱讀並采取行動。

在所有情況下,必須正確保護對變量或隊列的訪問以進行多線程訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM