atitit. java queue 隊列體系and自訂基於資料庫的隊列總結o7t,atitito7t
atitit. java queue 隊列體系and自訂基於資料庫的隊列總結o7t
1. 阻塞隊列和非阻塞隊列 1
2. java.util.Queue介面, 1
3. ConcurrentLinkedQueue 2
4. BlockingQueue阻塞隊列 2
4.1. 1. ArrayBlockingQueue 3
4.2. 2. LinkedBlockingQueue 3
4.3. 3. DelayQueue 3
4.4. 4. PriorityBlockingQueue 3
4.5. SynchronousQueue 3
5. LinkedBlockingDeque 乃阻塞雙端隊列 3
6. 自訂隊列實現Queue介面 4
7. 參考 4
1. 阻塞隊列和非阻塞隊列
多數生產消費模型的首選資料結構就是隊列。Java提供的安全執行緒的Queue可以分為阻塞隊列和非阻塞隊列,其中阻塞隊列的典型例子是BlockingQueue,非阻塞隊列的典型例子是ConcurrentLinkedQueue,在實際應用中要根據實際需要選用阻塞隊列或者非阻塞隊列。
同步是阻塞模式,非同步是非阻塞模式
作者:: 老哇的爪子 Attilax 艾龍, EMAIL:1466519819@qq.com
轉載請註明來源: http://blog.csdn.net/attilax
2. java.util.Queue介面,
在java5中新增加了java.util.Queue介面,
用以支援隊列的常見操作。該介面擴充了java.util.Collection介面。
Queue使用時要盡量避免Collection的add()和remove()方法,而是要使用offer()來加入元素,使用poll()來擷取並移出元素。它們的優
點是通過返回值可以判斷成功與否,add()和remove()方法在失敗的時候會拋出異常。 如果要使用前端而不移出該元素,使用
element()或者peek()方法。
值得注意的是LinkedList類實現了Queue介面,因此我們可以把LinkedList當成Queue來用。
3. ConcurrentLinkedQueue4. BlockingQueue阻塞隊列
BlockingQueue不光實現了一個完整隊列所具有的準系統,同時在多線程環境下,他還自動管理了多線間的自動等待於喚醒功能,從而使得程式員可以忽略這些細節,關注更進階的功能。
阻塞實現通常使用加鎖上實現...
常見BlockingQueue
在瞭解了BlockingQueue的準系統後,讓我們來看看BlockingQueue家庭大致有哪些成員?
首先,看看BlockingQueue提供的常用方法: |
可能報異常 |
返回布爾值 |
可能阻塞 |
設定等待時間 |
入隊 |
add(e) |
offer(e) |
put(e) |
offer(e, timeout, unit) |
出隊 |
remove() |
poll() |
take() |
poll(timeout, unit) |
查看 |
element() |
peek() |
無 |
無 |
·
從上表可以很明顯看出每個方法的作用,這個不用多說。我想說的是: add(e) remove() element() 方法不會阻塞線程。當不滿足約束條件時,會拋出IllegalStateException 異常。例如:當隊列被元素填滿後,再調用add(e),則會拋出異常。
· offer(e) poll() peek() 方法即不會阻塞線程,也不會拋出異常。例如:當隊列被元素填滿後,再調用offer(e),則不會插入元素,函數返回false。
· 要想要實現阻塞功能,需要調用put(e) take() 方法。當不滿足約束條件時,會阻塞線程。
BlockingQueue成員詳細介紹
4.1. 1. ArrayBlockingQueue4.2. 2. LinkedBlockingQueue
基於鏈表的阻塞隊列
4.3. 3. DelayQueue
DelayQueue中的元素只有當其指定的延遲時間到了,才能夠從隊列中擷取到該元素
4.4. 4. PriorityBlockingQueue
基於優先順序的阻塞隊列(優先順序的判斷通過構造 函數傳入的Compator對象來決定),但需要注意的是PriorityBlockingQueue並不會阻塞資料生產者,而只會在沒有可消費的資料 時,阻塞資料的消費者。因此使用的時候要特別注意,生產者生產資料的速度絕對不能快於消費者消費資料的速度,否則時間一長,會最終耗盡所有的可用堆記憶體空 間。在實現PriorityBlockingQueue時,內部控制線程同步的鎖採用的是公平鎖。
4.5. SynchronousQueue5. LinkedBlockingDeque 乃阻塞雙端隊列
ArrayDeque 雙向隊列
LinkedBlockingDeque 阻塞雙端隊列
ArrayBlockingQueue 雙向並發阻塞隊列
LinkedBlockingQueue FIFO隊列
ConcurrentLinkedQueue 基於連結節點的無界安全執行緒隊列
PriorityBlockingQueue 帶優先順序的無界阻塞隊列
還有很多很多,可以看看AbstractQueue, Deque有哪些實作類別。
6. 自訂隊列實現Queue介面
實現add ,remove (obj) 方法...
And 大大量操作方法... addBatch , peekBatch ,
7. 參考
java中線程隊列BlockingQueue的用法-shwenwen-ITPUB部落格.htm
Java並發包中的同步隊列SynchronousQueue實現原理 _ 並發編程網 - ifeve.com.htm
Java多線程總結之安全執行緒隊列Queue - 火木棉的日誌 - 網易部落格.htm
java編程:定義一個表示隊列的泛型類Queue,分別對String對象與Integer對象執行入隊列與出隊列操作
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Queue<T>{
private static LinkedList q;
private T t;
private T getT(T t){
return t;
}
public void setT(T t){
this.t=t;
}
public Queue(T t){
this.t=t;
}
private void offer(){
if(q!=null){
q.offer(t);
}
else{
q=new LinkedList();
q.offer(t);
}
}
public List poll(){
List list=null;
while(q!=null&&q.size()>0){
list=new ArrayList();
list.add(q.poll());
}
return list;
}public static void main(String []args){
Queue<Integer>q=new Queue<Integer>(1);
q.offer();
List list=q.poll();
System.out.println("出隊列的元素為:"+list.get(0));
Queue<String>qq=new Queue<String>("1");
q.offer();
List list2=q.poll();
System.out.println("出隊列的元素為:"+list2.get(0));
}
// TODO Auto-generated method stub
}
java 怎 從資料庫批量取數入隊列,再逐條處理關鍵是訊息佇列的實現
為什麼要用到訊息佇列?
你這個需求貌似只需要隊列這個資料結構就行了
使用JDK中內建的就行,LinkedList是實現Queue的
Queue queue = new LinkedList();
queue.add(Object )//尾部添加
queue.remove()//頭部取出
你只需要將通過JDBC把資料庫取出的對象用迴圈依次add到queue, 然後再通過迴圈依次remove就行了