如何在Java中设置和获取线程的名称

563 阅读2分钟

在这篇文章中,我们将通过简单的例子来学习如何在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-1pool-1-thread-2pool-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给出的线程默认名称。