Java

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,代表它会最后出队,当执行这个任务时,代表任务所有的任务执行完毕,可以关闭线程池资源。

...

Java字符串的不可变

更新于 2025-04-28

openjdk 11openjdk17运行代码的结果会有不同。

出于安全策略,setAccessible(true)方法会抛出异常:

1java.lang.reflect.InaccessibleObjectException:
2Unable to make field private final byte[] java.lang.String.value accessible:
3module java.base does not "opens java.lang" to unnamed module @1a2a0702