PriorityBlockingQueue and DelayQueue
PriorityBlockingQueue #
PriorityBlockingQueue就是一个基础的可阻塞的
优先级队列,当队列为空时,从队列中获取元素时被阻塞。其余特性和优先级队列是一致的。
下例展示了如何构建一个可以放入优先级队列的任务:
1public class PrioritizedTask implements Runnable, Comparable<PrioritizedTask> {
2 protected static List<PrioritizedTask> sequence = new ArrayList<>();
3 private Random rand = new Random(47);
4 private static int counter = 0;
5 private final int id = counter++;
6 private final int priority;
7
8
9 public PrioritizedTask(int priority) {
10 this.priority = priority;
11 sequence.add(this);
12 }
13
14 @Override
15 public int compareTo(PrioritizedTask arg) {
16 return priority < arg.priority ? 1 :
17 (priority > arg.priority ? -1 : 0);
18 }
19
20 @Override
21 public void run() {
22 try {
23 TimeUnit.MILLISECONDS.sleep(rand.nextInt(250));
24 } catch (InterruptedException e) {
25 // Acceptable way to exit
26 }
27 System.out.println(this);
28 }
29
30 @Override
31 public String toString() {
32 return String.format("[%1$-3d]", priority) +
33 " Task " + id;
34 }
35
36 public String summary() {
37 return "(" + id + ":" + priority + ")";
38 }
39
40 public static class EndSentinel extends PrioritizedTask {
41 private ExecutorService exec;
42
43 public EndSentinel(ExecutorService e) {
44 super(-1); // Lowest priority in this program
45 exec = e;
46 }
47
48 @Override
49 public void run() {
50 int count = 0;
51 for (PrioritizedTask pt : sequence) {
52 System.out.print(pt.summary());
53 if (++count % 5 == 0)
54 System.out.println();
55 }
56 System.out.println();
57 System.out.println(this + " Calling shutdownNow()");
58 exec.shutdownNow();
59 }
60 }
61}
PrioritizedTask实现了Runnable和Comparable接口,有一个int型priority域,用来表示任务的优先级,在compareTo方法中的逻辑表示,优先级高的将会优先出队。其还有一个静态域,用来记录所有任务被置入队列的顺序。PrioritizedTask有一个静态内部类,也是其子类,它被称作“结束哨兵”,它的优先级为-1,代表它会最后出队,当执行这个任务时,代表任务所有的任务执行完毕,可以关闭线程池资源。