在 callable 中可通过 thread.currentthread().getname() 获取当前执行线程名称(如 pool-1-thread-2),通过 thread.currentthread().getpriority() 获取优先级(默认 5,范围 1–10);线程池复用线程,优先级应在 threadfactory 中统一设置,避免在 call() 中动态修改。

在 Callable 中获取当前执行线程的名称与优先级,和在普通线程或 Runnable 中一样,直接通过 Thread.currentThread() 获取即可。因为 Callable 的 call() 方法是在某个具体线程中执行的(比如线程池中的工作线程),所以它天然能访问该线程的上下文信息。
获取当前线程名称
Thread.currentThread().getName() 返回当前正在执行 call() 方法的线程名。这个名称通常是线程池创建时指定的(如 pool-1-thread-2),也可能是自定义的线程工厂设置的。
- 默认线程池(如
Executors.newFixedThreadPool(3))使用DefaultThreadFactory,线程名格式为pool-N-thread-M - 若使用自定义
ThreadFactory,可提前设置有意义的名称,便于日志追踪
获取当前线程优先级
Thread.currentThread().getPriority() 返回当前线程的调度优先级,取值范围是 Thread.MIN_PRIORITY(1)到 Thread.MAX_PRIORITY(10),默认为 Thread.NORM_PRIORITY(5)。
- 注意:线程优先级只是提示操作系统调度器,并不保证严格生效,尤其在不同 OS 或 JVM 实现上行为可能不同
- 线程池中的线程通常继承创建时的优先级(例如主线程是 5,新线程默认也是 5),但可通过自定义
ThreadFactory显式设置
实际用法示例
下面是一个完整的小例子:
Callable<string> task = () -> {
String name = Thread.currentThread().getName();
int priority = Thread.currentThread().getPriority();
System.out.println("执行线程名:" + name + ",优先级:" + priority);
return "done";
};
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(task).get();
executor.shutdown();
</string>
输出类似:执行线程名:pool-1-thread-1,优先级:5
注意事项
不要试图在 call() 中修改当前线程的优先级(如调用 setPriority()),除非你明确知道后果:
- 线程池复用线程,改优先级会影响后续任务的执行环境
- 多数场景下不应动态调整,优先级应在创建线程时由
ThreadFactory统一设定 - 普通业务逻辑一般无需关心优先级,更应关注任务拆分、异步协调等设计
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











