PriorityBlockingQueue基于优先级的阻塞队列(优先级的判断通过构造函数传入的Compator对象来决定,也就是传入的对象必须实现Comparable接口),在实现
PriorityBlockingQueue时,内部线程同步锁采用的是公平锁,他也是个无界的对列。
测试代码
public static void main(String[] args)
throws Exception{
PriorityBlockingQueue<Task> q =
new PriorityBlockingQueue<Task>();
Task t1 =
new Task();
t1.setId(
3);
t1.setName(
"任务1");
Task t2 =
new Task();
t2.setId(
6);
t2.setName(
"任务2");
Task t3 =
new Task();
t3.setId(
1);
t3.setName(
"任务3");
q.add(t1);
q.add(t2);
q.add(t3);
System.
out.println(
"=============>"+q.take().getId());
System.
out.println(
"=============>"+q.take().getId());
System.
out.println(
"=============>"+q.take().getId());
}
DelayQueue带有延迟时间的Queue,其中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素.DelayQueue中的元素必须实现Delayed接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时数据进行移除、任务超时数据处理、空闲连接关闭等等.测试案例public class Wangmin
implements Delayed {
private String
name;
private String
id;
//截止时间
private long endTime;
//定义时间工具类
private TimeUnit
timeUnit = TimeUnit.
SECONDS;
public Wangmin(String name, String id,
long endTime) {
this.
name = name;
this.
id = id;
this.
endTime = endTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.
name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.
id = id;
}
public long getEndTime() {
return endTime;
}
public void setEndTime(
long endTime) {
this.
endTime = endTime;
}
@Override
public long getDelay(TimeUnit unit) {
return endTime-System.
currentTimeMillis();
}
@Override
public int compareTo(Delayed o) {
Wangmin w=(Wangmin) o;
return this.getDelay(
this.
timeUnit)-w.getDelay(
this.
timeUnit)>
0?
1:
0;
}
}
public class Wangba
implements Runnable {
private DelayQueue<Wangmin>
queue =
new DelayQueue<Wangmin>();
public boolean yingye =
true;
public void shangji(String name,String id,
int money){
Wangmin man =
new Wangmin(name,id,
1000*money+System.
currentTimeMillis());
System.
out.println(
"网名"+man.getName()+
" 身份证"+man.getId()+
"交钱"+money+
"块,开始上机...");
this.
queue.add(man);
}
public void xiaji(Wangmin man){
System.
out.println(
"网名"+man.getName()+
" 身份证"+man.getId()+
"时间到下机...");
}
@Override
public void run() {
while (
yingye){
try {
Wangmin man =
queue.take();
xiaji(man);
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
System.
out.println(
"网吧开始营业");
Wangba siyu =
new Wangba();
Thread shangwang =
new Thread(siyu);
shangwang.start();
siyu.shangji(
"路人甲",
"123",
1);
siyu.shangji(
"路人乙",
"234",
10);
siyu.shangji(
"路人丙",
"345",
5);
}
catch (Exception e){
e.printStackTrace();
}
}
}