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
public Test(int capacity){
list = new ArrayBlockingQueue
}
public void add(int size){
for(int i=0;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
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
public PQTest(int capacity,Comparator com){
queue = new PriorityQueue
}
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: j2se
Leave a Reply
You must be logged in to post a comment.
近期评论