阻塞队列详述
1.BlockingQueue概述
ArrayBlockingQueue LinkedBlockingQueue DelayQueue PriorityBlockingQueue SynchronousQueue
共有方法:
抛异常:如果试图的操作无法立即执行,抛一个异常。特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。阻塞:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。超时:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等 待时间不会超过给定值。返回一个特定值以告知该操作是否成功(典型的是 true / false)。
.2.公平与非公平策略
假设: 处理需要1s,唤醒需要2秒 处理队列的4个消息,公平策略需要?10秒 非公平策略需要?4秒
3.ArrayBlockingQueue
package cn
.tedu
.queue
;
import java
.util
.concurrent
.ArrayBlockingQueue
;
import java
.util
.concurrent
.TimeUnit
;
import org
.junit
.Test
;
public class ArrayBlockingQueueDemo {
@Test
public void abqmethodTest() throws Exception
{
ArrayBlockingQueue
<Object> abq
=
new ArrayBlockingQueue<Object>(10,true);
for (int i
= 0; i
< 10; i
++) {
abq
.add(i
);
}
System
.out
.println(abq
.offer(11, 5000, TimeUnit
.MILLISECONDS
));
}
}
4.LinkedBlockingQueue
package cn
.tedu
.queue
;
import java
.util
.concurrent
.LinkedBlockingQueue
;
import java
.util
.concurrent
.TimeUnit
;
import org
.junit
.Test
;
public class LinkedBlockingQueueDemo {
@Test
public void lbqTest() throws Exception
{
LinkedBlockingQueue
<Object> lbq
=
new LinkedBlockingQueue<Object>();
System
.out
.println(lbq
.poll(5, TimeUnit
.SECONDS
));
}
}
5.PriorityBlockingQueue
package cn
.tedu
.queue
;
public class Student implements Comparable<Student>{
private String name
;
private int age
;
public Student(String name
,int age
){
this.name
= name
;
this.age
= age
;
}
@Override
public int compareTo(Student o
) {
return this.age
- o
.getAge();
}
public String
getName() {
return name
;
}
public void setName(String name
) {
this.name
= name
;
}
public int getAge() {
return age
;
}
public void setAge(int age
) {
this.age
= age
;
}
@Override
public String
toString() {
return "Student [name=" + name
+ ", age=" + age
+ "]";
}
}
package cn
.tedu
.queue
;
import java
.util
.concurrent
.PriorityBlockingQueue
;
import org
.junit
.Test
;
public class PriorityBlockingQueueDemo {
@Test
public void createPbqTest(){
PriorityBlockingQueue
<Student> pbq
=
new PriorityBlockingQueue<Student>(4);
Student s1
= new Student("zhangsan",22);
Student s2
= new Student("lisi",8);
Student s3
= new Student("wangwu",88);
Student s4
= new Student("xiaoming",66);
pbq
.add(s1
);
pbq
.add(s2
);
pbq
.add(s3
);
pbq
.add(s4
);
for (int i
= 0; i
< 4; i
++) {
System
.out
.println(pbq
.poll());
}
}
}
6.其他队列
SynchronousQueue:只能够容纳单个元素。 BlockingDeque:两端都能增删