原先在java編程中,Queue的實現都是用LinkedList
- Queue queue = new LinkedList();
但正如jdk中所說的那樣:
注意,此實現不是同步的。如果多個線程同時訪問一個鏈接列表,而其中至少一個線程從結構上修改了該列表,則它必須 保持外部同步。(結構修改指添加或刪除一個或多個元素的任何操作;僅設置元素的值不是結構修改。)這一般通過對自然封裝該列表的對象進行同步操作來完成
LinkeList顯示源碼:http://blog.csdn.net/lengyuhong/archive/2010/10/27/5969325.aspx
所以為方便起見,可以直接寫一個線程安全的LinkedList實現的Queue類,這段程序原先是由我朋友夏裔編寫,我只做了一些小的改動,特此說明
源程序:
- import java.util.LinkedList;
- /***
- * 隊列,其中關鍵的數據結構是LinkedList
- * 為什么不用jdk自帶的實現了Queue接口的LinkedList類,而要自己在再寫一遍的原因是
- * 注意,此實現不是同步的。如果多個線程同時訪問一個鏈接列表,而其中至少一個線程從結構上修改了該列表,則它必須 保持外部同步。
- * (結構修改指添加或刪除一個或多個元素的任何操作;僅設置元素的值不是結構修改。)
- * 這一般通過對自然封裝該列表的對象進行同步操作來完成
- * 因此,為方便起見,直接寫了這個線程同步的Queue對象類
- * @author xiayi and zhujiadun
- * time:2010年10月27日14:34:51
- */
- public class LinkedListQueue<E> {
- private LinkedList<E> list = new LinkedList<E>();
- private int size = 0;
- public synchronized void put(E e) {
- size++;
- list.addLast(e);
- }
- // 使用removeFirst()方法,返回隊列中第一個數據,然后將它從隊列中刪除
- public synchronized E get() {
- size--;
- return list.removeFirst();
- }
- public synchronized boolean empty() {
- boolean flag = false;
- if(size==0){
- flag = true;
- }
- return flag;
- }
- public synchronized int size(){
- return size;
- }
- public synchronized void clear() {
- list.clear();
- size = 0;
- }
- public synchronized E get(int i){
- return list.get(i);
- }
- }