如何获取FixedThreadPool中线程的编号及提取线程名称中的编号?
获取FixedThreadPool中线程的编号及提取线程名中的数字编号
一、获取线程的系统ID(Thread ID)
如果是要获取JVM分配给线程的唯一系统标识,可以直接用Thread类自带的getId()方法,这个方法返回的long类型数值是JVM层面给线程的唯一ID,和线程池的自定义命名无关:
long threadId = Thread.currentThread().getId();
二、从默认线程名中提取线程池内的编号
FixedThreadPool默认给线程的命名格式是pool-N-thread-M(N是线程池的全局序号,M是该线程在当前池内的编号)。要提取最后的M数字,给你两种实用方法:
方法1:字符串分割法
通过split("-")按减号拆分字符串,直接取最后一段转成整数:
String threadName = Thread.currentThread().getName(); // 拆分后数组为["pool", "1", "thread", "1"],取索引3的元素 int poolThreadNumber = Integer.parseInt(threadName.split("-")[3]);
小提醒:默认格式是四段内容,别把索引搞错啦!
方法2:正则表达式法(更健壮)
用正则匹配替换掉最后一个减号及之前的所有内容,直接提取末尾的数字:
String threadName = Thread.currentThread().getName(); // 替换掉最后一个"-"之前的所有字符,剩下的就是数字 int poolThreadNumber = Integer.parseInt(threadName.replaceAll(".*-", ""));
这种方法兼容性更强,哪怕你自定义了线程池的前缀名称,只要最后是-数字的格式,都能正常提取。
更稳定的进阶方案:自定义线程工厂
要是觉得依赖默认线程名提取编号不够稳妥(比如后续线程池命名规则可能调整),可以自己实现ThreadFactory,手动给线程分配编号并记录:
import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; public class NumberedThreadFactory implements ThreadFactory { private final AtomicInteger threadCounter = new AtomicInteger(1); private final String poolPrefix; public NumberedThreadFactory(String poolPrefix) { this.poolPrefix = poolPrefix; } @Override public Thread newThread(Runnable r) { int currentNum = threadCounter.getAndIncrement(); Thread thread = new Thread(r, poolPrefix + "-thread-" + currentNum); // 还可以把编号存在线程的自定义属性里,方便后续直接获取 thread.setDaemon(false); // 根据业务需求设置是否为守护线程 return thread; } }
使用时直接传入自定义工厂:
ExecutorService executor = Executors.newFixedThreadPool(5, new NumberedThreadFactory("my-business-pool"));
这样不仅能自定义线程名,还能通过线程工厂的计数器直接获取编号,完全不用依赖字符串解析,可控性拉满。
内容的提问来源于stack exchange,提问作者J.FF
相关产品推荐
相关产品推荐

