在这篇文章中,我们将通过简单的例子来学习如何在Java中使用线程类中的内置方法setName()和getName()来设置和获取线程名称。
1.获取线程名称
默认情况下,Java编译器在创建每个线程时都会设置一个默认名称,我们可以通过使用 Thread.currentThread().getName()方法获得线程名称。
在下面的例子中,我们通过实现Runnable接口和它的run() 方法创建了一个线程。这段代码将把线程的默认名称打印到控制台。
Thread thread = new Thread(() -> {
System.out.println(Thread.currentThread().getName());
});
thread.start(); //Prints Thread-0
如果我们创建了更多的线程,那么默认名称中的数字部分将随着线程数量的增加而增加,即Thread-1,Thread-2, Thread*-* 3...等等。
同样地,默认名称也是以pool-1-thread-1的模式为在ExecutorService中运行的线程生成的。
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.submit(() -> {
System.out.println(Thread.currentThread().getName()); //Prints pool-1-thread-1
});
如果我们在这个执行器中运行3个任务,那么线程名称将是pool-1-thread-1、pool-1-thread-2、pool-1-thread-3。请看下面的例子以更好地理解命名模式。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
ExecutorService executorService = null;
try {
executorService = Executors.newFixedThreadPool(3); //pool-1
executorService.submit(() -> {
System.out.println(Thread.currentThread().getName()); //thread-1
});
executorService.submit(() -> {
System.out.println(Thread.currentThread().getName()); //thread-2
});
executorService = Executors.newFixedThreadPool(3); //pool-2
executorService.submit(() -> {
System.out.println(Thread.currentThread().getName()); //thread-1
});
} finally {
executorService.shutdown();
}
}
}
该程序的输出是。
pool-1-thread-1
pool-1-thread-2
pool-2-thread-1
2.为线程设置名称
我们可以通过两种方式设置线程的自定义名称。
- 线程类构造函数
- Thread.setName()方法
2.1.使用线程构造器
我们可以使用以下接受线程名称作为参数的构造函数之一。
Thread(String name);
Thread(Runnable task, String name);
Thread(ThreadGroup group, String name);
Thread(ThreadGroup group, Runnable task, String name);
让我们看一个使用构造函数来设置线程名称的例子。
Thread thread = new Thread(() -> {
System.out.println("Thread name is : " + Thread.currentThread().getName()); //Prints "Thread name is : Demo-Thread"
}, "Demo-Thread");
thread.start();
2.2.使用Thread.setName()
setName()方法只接受一个字符串类型的参数,不返回任何东西。如果我们在创建线程时没有设置线程名称,或者线程是使用lambda风格的语法创建的,那么这个方法就很有用。
Thread thread= new Thread(() -> {
System.out.println(Thread.currentThread().getName()); //Prints 'Custom-Thread'
});
oddThread.setName("Custom-Thread");
同样地,我们也可以在ExecutorSerivce中使用这个方法。
executorService.submit(() -> {
Thread.currentThread().setName("Executor-Thread");
System.out.println(Thread.currentThread().getName()); //Prints 'Executor-Thread'
});
3.总结
本教程教会了我们为线程设置一个新的自定义名称的不同方法。我们使用了线程类的构造函数和同一类的setName()方法。同样,我们使用getName()来获取线程名称,并了解JVM给出的线程默认名称。