轉載自:http://blog.csdn.net/guijava/article/details/3784658
通俗的解釋
消息隊列,顧名思義 首先是個隊列。
隊列的操作有入隊和出隊
也就是你有一個程序在產生內容然后入隊(生產者) 另一個程序讀取內容,內容出隊(消費者)
這是最最基本的概念。
我想你應該是缺乏一個使用場景。
當你不需要立即獲得結果,但是並發量又不能無限大的時候,差不多就是你需要使用消息隊列的時候。
比如你寫日志,因為可能一個客戶端有多個操作去寫,又有很多個客戶端,顯然並發不能無窮大,於是你就需要把寫日志的請求放入到消息隊列里,在消費者那邊依次把隊列中產生的日志寫到數據庫里。
消息隊列有無數開源實現,一般沒必要自己實現。zmq也好rabbitmq也好甚至redis也好,找一個合適的裝上用就行
就好像rdbms/nosql一樣
技術都是解決問題的,消息隊列解決的是將突發大量請求轉換為后端能承受的隊列請求,比如你的服務器一秒能處理100個訂單,但秒殺活動1秒進來1000個訂單,持續10秒,在后端能力無法增加的情況下,你可以用消息隊列將總共10000個請求壓在隊列里,后台consumer按原有能力處理,100秒后處理完所有請求(而不是直接宕機丟失訂單數據)
在java5中新增加了java.util.Queue接口,用以支持隊列的常見操作。Queue接口與List、Set同一級別,都是繼承了Collection接口。
Queue使用時要盡量避免Collection的add()和remove()方法,而是要使用offer()來加入元素,使用poll()來獲取並移出元素。它們的優
點是通過返回值可以判斷成功與否,add()和remove()方法在失敗的時候會拋出異常。 如果要使用前端而不移出該元素,使用
element()或者peek()方法。
值得注意的是LinkedList類實現了Queue接口,因此我們可以把LinkedList當成Queue來用。
LinkedList實現了Queue接口。Queue接口窄化了對LinkedList的方法的訪問權限(即在方法中的參數類型如果是Queue時,就完全只能訪問Queue接口所定義的方法 了,而不能直接訪問 LinkedList的非Queue的方法),以使得只有恰當的方法才可以使用。BlockingQueue 繼承了Queue接口
1 小例子:
2
3 /**
4 *
5 * @author Zang XT
6 */
7 import java.util.Queue;
8 import java.util.LinkedList;
9 public class TestQueue {
10 public static void main(String[] args) {
11 Queue<String> queue = new LinkedList<String>();
12 queue.offer("Hello");
13 queue.offer("World!");
14 queue.offer("你好!");
15 System.out.println(queue.size());
16 String str;
17 while((str=queue.poll())!=null){
18 System.out.print(str);
19 }
20 System.out.println();
21 System.out.println(queue.size());
22 }
23 }

