在 cyclicbarrier 的 barrieraction 中,只能通过 thread.currentthread() 获取执行该动作的单个线程(通常是最后一个 await 的线程)的名称和优先级,无法获取其他等待线程信息;线程优先级仅为调度提示,不可依赖于同步控制。

在 CyclicBarrier 的屏障动作(Runnable barrierAction)中,可以通过 Thread.currentThread() 获取当前执行该动作的线程对象,进而获取其名称和优先级。注意:这个线程**不是等待线程本身**,而是被唤醒后**负责执行 barrierAction 的那个线程**(通常是最后一个调用 await() 并触发屏障的线程)。
如何在 barrierAction 中获取线程名与优先级
创建 CyclicBarrier 时传入一个自定义的 Runnable,在它的 run() 方法里调用:
-
Thread.currentThread().getName()→ 获取当前执行 barrierAction 的线程名 -
Thread.currentThread().getPriority()→ 获取该线程的整数型优先级(默认为 5,范围 1–10)
示例代码:
CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
@Override
public void run() {
Thread t = Thread.currentThread();
System.out.println("Barrier action executed by: " + t.getName()
+ ", priority = " + t.getPriority());
}
});
注意:这不是“所有等待线程”的信息
CyclicBarrier 的 barrierAction 只由**一个线程**执行,它无法直接访问其他已 await 的线程列表。JDK 不提供获取“当前有多少线程在等待”或“列出所有等待线程”的公开 API。若需跟踪参与线程,需在调用 await() 前自行记录,例如用 ThreadLocal 或共享集合(注意并发安全)。
线程优先级的实际意义有限
Java 线程优先级是提示操作系统调度器的建议值,并不保证严格顺序或实时性。尤其在主流 OS(Linux/Windows/macOS)上,JVM 通常将 Java 优先级映射到有限的底层调度级别,甚至可能全部忽略。不要依赖优先级来控制执行顺序或同步逻辑。
如果想在每个 await 前打印自身线程信息
可在每个线程调用 barrier.await() 前主动打印:
System.out.println(Thread.currentThread().getName()
+ " (priority=" + Thread.currentThread().getPriority()
+ ") entering barrier...");
barrier.await();
这样每条参与线程都能输出自己的上下文,比只在 barrierAction 中看一条更全面。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











