Java中Queue类实现

原先在java编程中,Queue的实现都是用LinkedList

 

  1. Queue queue = new LinkedList();  

 

但正如jdk中所说的那样:

注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成

LinkeList显示源码:http://blog.csdn.net/lengyuhong/archive/2010/10/27/5969325.aspx

 

 

所以为方便起见,可以直接写一个线程安全的LinkedList实现的Queue类,这段程序原先是由我朋友夏裔编写,我只做了一些小的改动,特此说明

源程序:

 

  1. import java.util.LinkedList;  
  2. /*** 
  3.  * 队列,其中关键的数据结构是LinkedList 
  4.  * 为什么不用jdk自带的实现了Queue接口的LinkedList类,而要自己在再写一遍的原因是 
  5.  * 注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。 
  6.  * (结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。) 
  7.  * 这一般通过对自然封装该列表的对象进行同步操作来完成 
  8.  * 因此,为方便起见,直接写了这个线程同步的Queue对象类 
  9.  * @author xiayi and zhujiadun 
  10.  * time:2010年10月27日14:34:51 
  11.  */  
  12. public class LinkedListQueue<E> {  
  13.     private LinkedList<E> list = new LinkedList<E>();  
  14.     private int size = 0;  
  15.       
  16.     public synchronized void put(E e) {  
  17.         size++;  
  18.         list.addLast(e);  
  19.     }  
  20.     // 使用removeFirst()方法,返回队列中第一个数据,然后将它从队列中删除  
  21.     public synchronized E get() {  
  22.         size--;  
  23.         return list.removeFirst();  
  24.     }  
  25.     public synchronized boolean empty() {  
  26.         boolean flag = false;  
  27.         if(size==0){  
  28.             flag = true;  
  29.         }  
  30.         return flag;  
  31.     }  
  32.       
  33.     public synchronized int size(){  
  34.         return size;  
  35.     }  
  36.     public synchronized void clear() {  
  37.         list.clear();  
  38.         size = 0;  
  39.     }  
  40.       
  41.     public synchronized E get(int i){  
  42.         return list.get(i);  
  43.     }  
  44. }  

 

原文地址:https://www.cnblogs.com/Free-Thinker/p/3581490.html