线程名称的确定方式如下:
一、默认线程名称
未显式设置时
线程默认采用`Thread-0`、`Thread-1`等格式,名称由系统自动分配,格式通常为`pool-N-thread-N`(如`pool-1-thread-1`)。
主线程名称
主线程(即执行`main`方法的线程)默认名称为`main`。
二、显式设置线程名称
通过构造函数设置
在创建线程对象时直接传入名称,例如:
```java
Thread thread = new Thread("自定义名称");
thread.start();
```
通过`setName()`方法设置
在线程启动后调用`setName(String name)`方法,例如:
```java
Thread thread = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println(this.getName());
}
});
thread.setName("自定义名称");
thread.start();
```
继承Thread类设置
通过继承`Thread`类并重写`run()`方法,在`run()`内部调用`setName()`,例如:
```java
class MyThread extends Thread {
@Override
public void run() {
this.setName("自定义名称");
// 线程执行逻辑
}
}
```
三、获取线程名称
使用`Thread.currentThread().getName()`方法可获取当前执行线程的名称。
四、注意事项
名称冲突
允许不同线程使用相同名称,但建议避免重复命名以提高可读性。
线程池中的自定义名称
在使用`ExecutorService`时,若未指定自定义`ThreadFactory`,线程名称仍为默认格式。可通过实现`ThreadFactory`或使用`BasicThreadFactory`、`ThreadFactoryBuilder`来自定义名称格式,例如:
```java
ExecutorService executor = Executors.newFixedThreadPool(3, new BasicThreadFactory());
executor.submit(() -> System.out.println(Thread.currentThread().getName()));
```
自定义名称格式可通过`setNameFormat(String pattern)`方法设置,例如`"worker-[thread-number]"`。
通过以上方法,可灵活控制线程名称,便于调试和日志记录。