十一 20

J2SE 5.0里面添加了新的用于提高同步性能的集合类–Queue。Queue是一个FIFO队列,她的作用主要是提高了并发访问性能,她与原来集合类当中的List的区别包括:

1.      她提供了一些新的方法,用于添加元素的offer(),用于删除元素的poll(),用于获取队首元素的peak()。这些操作与原来的add(),remove()的区别在于,原有的add(),remove()和element()当所需操作失败的时候会抛出异常,而新的offer()和poll()则不会,当队列不能容纳新元素时,offer()直接返回,当队列没有元素可取的时候,poll()操作,返回null。

    例子:
    public class Test{
         private ArrayBlockingQueue list;
         public Test(int capacity){
              list = new ArrayBlockingQueue(capacity);
         }

         public void add(int size){
             for(int i=0;i                   list.add(i);
                  output();
              }
         }

         public void output(){
             for(int i:list){
                  System.out.print(i+”  ”);
             }
         }

         public static void main(String[] args){        
             Test t = new Test(2);
             t.add(3);    
         }    
    }



    往一个容量为2的队列里面添加3个元素,他的输出为:
=======    Start   ===============================================
    0
=========================================    Stop    ==============

   

=======    Start   ===============================================
    0  1
=========================================    Stop    ==============

    Exception in thread “main” java.lang.IllegalStateException: Queue full
           at java.util.AbstractQueue.add(Unknown Source)
            at Test.add(Test.java:14)
           at Test.main(Test.java:32)

    把上述代码修改为:
    public void add(int size){
             for(int i=0;i                   list.offer(i);
                  output();
              }
         }
    输出为:
=======    Start   ===============================================
    0
=========================================    Stop    ==============

   

=======    Start   ===============================================
    0  1
=========================================    Stop    ==============

   

=======    Start   ===============================================
    0  1
=========================================    Stop    ==============

   

2.      BlockingQueue是Queue的一个子接口,她提供了新的用于阻塞的操作,take()和put(),当队列没有空间,而线程欲通过put()往队列中添加元素时,线程会被阻塞。同理,当队列没有空间,而线程欲通过take()往队列中获取元素时,线程也会被阻塞。利用BlockingQueeu,我们可以很简单的实现生产者和消费者问题。
    例子:
    生产者:
public class Producer extends Thread{
   private BlockingQueue queue;
   private int count;

   public Producer(BlockingQueue queue){
        this.queue = queue;
        count = 0;
   }

   public void run(){
        while(true){
            try{
                 queue.put(produce());
            }catch(Exception e){
                 e.printStackTrace();
            }
        }
   }

   private Integer produce(){
        System.out.println(“Produce: “+count);
        return new Integer(count++);
   }

}



消费者:
public class Consumer extends Thread{    
   private BlockingQueue queue;
   private int id;    
   
   public Consumer(BlockingQueue queue){
        this.queue = queue;
   }

   public void run(){
        while(true){
            try{
                 Thread.currentThread().sleep(step);
                 consume((Integer)queue.take());
            }catch(Exception e){
                 e.printStackTrace();
            }
        }
   }
   
   private void consume(Integer i){
        System.out.println(“\t\t Consume: “+i);
   }
}

测试程序:
public class CPTest{
   public static void main(String[] args){
        ArrayBlockingQueue queue = new ArrayBlockingQueue(3);
        Consumer c1 = new Consumer(queue);
        Consumer c2 = new Consumer(queue);
        Producer p = new Producer(queue);
       
        c1.start();
        c2.start();
        p.start();        
   }
}

3.      PriorityQueue提供了基于优先级的排序。她会根据元素的自然序对所有加入的元素进行排序,另外,通过初始化时,提供定制的Comparator实现,可以改变他的顺序。注意:通过PriorityQueue返回的Iterator并不会保证按序返回队列中的值。
    例子:
public class PQTest{
   private PriorityQueue queue;
   public PQTest(int capacity,Comparator com){
        queue = new PriorityQueue(capacity,com);
   }
   
   public void add(int size){      
        for(int i=0;i < size;i++){
            queue.offer(i);    
        }        
   }
   
   public void output(){      
        for(int i:queue){
            System.out.print(i+”  ”);
        }
        System.out.println();
        for(int i = 0 ; i<5;i++)
            System.out.print(queue.poll()+”  ”);
   }

   public static void main(String[] args){        
        PQTest t = new PQTest(6,new PQComparator());
        t.add(5);    
        t.output();
   }    
}
   
   Comparator实现为:
    public class PQComparator implements Comparator{
         public int compare(Integer i1,Integer i2){
             return -1 * (i1.intValue() – i2.intValue());
         }    
    }

    输出为:
=======    Start   ===============================================
    4  3  1  0  2
    4  3  2  1  0
=========================================    Stop    ==============


Tags:

作者:Jock

Leave a Reply

You must be logged in to post a comment.

Switch to our mobile site