2012-12-02 84 views
3

任務是實現我自己的線程安全的消息隊列。Java:實現自己的消息隊列(線程安全)

我的方法:

public class MessageQueue { 
    /** 
    * Number of strings (messages) that can be stored in the queue. 
    */ 
    private int capacity; 

    /** 
    * The queue itself, all incoming messages are stored in here. 
    */ 
    private Vector<String> queue = new Vector<String>(capacity); 

    /** 
    * Constructor, initializes the queue. 
    * 
    * @param capacity The number of messages allowed in the queue. 
    */ 
    public MessageQueue(int capacity) { 
     this.capacity = capacity; 
    } 

    /** 
    * Adds a new message to the queue. If the queue is full, it waits until a message is released. 
    * 
    * @param message 
    */ 
    public synchronized void send(String message) { 
     //TODO check 
    } 

    /** 
    * Receives a new message and removes it from the queue. 
    * 
    * @return 
    */ 
    public synchronized String receive() { 
     //TODO check 
     return "0"; 
    } 
} 

如果隊列是空的,我調用remove(),我想調用wait(),以便其他線程可以使用send()方法。分別,我必須在每次迭代之後調用notifyAll()。

問題:這可能嗎?我的意思是,當我在一個對象的一個​​方法中說wait()時,我可以執行同一個對象的另一個方法嗎?

而另一個問題:這似乎是聰明的?

回答

6

問題:這可能嗎?我的意思是,當我在一個對象的一個​​方法中說wait()時,我可以執行同一個對象的另一個方法嗎?

是的!這正是wait和notify/notifyAll的設計方式。如果在對象上調用wait(),那麼該線程會阻塞,直到另一個線程調用同一對象上的notify/notifyAll。

而另一個問題:這似乎是聰明的?

是的!這正是我如何(並已經)使用低級Java操作實現消息隊列的方式。


如果你有興趣,有一個在這不正是這個標準庫BlockingQueue類。如果你只想使用這樣的類,使用BlockingQueue。如果你的目標是學習如何實現一個消息隊列,然而,繼續你的方法,這是完全正確的。

public interface BlockingQueue<E> 
extends Queue<E> 

支持兩個附加等待獲取元素時隊列變爲非空,並等待空間在隊列中存儲元素時變得可用的操作的隊列。