1. 概述

在这个教程中,我们将探讨在Java中设置线程(Thread)名称的不同方法。首先,我们将创建一个示例,运行两个线程。一个只打印偶数,另一个只打印奇数。然后,我们将给线程设置自定义名称,并显示它们。

2. 设置线程名称的方法

Java中的Thread类为线程提供了默认名称。 在某些情况下,我们可能需要知道哪个线程正在运行,因此为线程提供一个自定义名称可以使它在其他运行线程中更容易识别。

让我们从定义一个简单的类开始,它创建两个线程。第一个线程将打印1到N之间的偶数,第二个线程将打印1到N之间的奇数。在我们的例子中,N为5。

我们还将打印线程的默认名称。

首先,我们创建两个线程:

public class CustomThreadNameTest {

    public int currentNumber = 1;

    public int N = 5;

    public static void main(String[] args) {

        CustomThreadNameTest test = new CustomThreadNameTest();

        Thread oddThread = new Thread(() -> {
            test.printOddNumber();
        });

        Thread evenThread = new Thread(() -> {
            test.printEvenNumber();
        });

        evenThread.start();
        oddThread.start();

    }
    // printEvenNumber() and printOddNumber()
}

printEvenNumberprintOddNumber方法中,我们将检查当前数字是偶数还是奇数,并将数字与线程名称一起打印:

public void printEvenNumber() {
    synchronized (this) {
        while (currentNumber < N) {
            while (currentNumber % 2 == 1) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() + " --> " + currentNumber);
            currentNumber++;
            notify();
        }
    }
}

public void printOddNumber() {
    synchronized (this) {
        while (currentNumber < N) {
            while (currentNumber % 2 == 0) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() + " --> " + currentNumber);
            currentNumber++;
            notify();
        }
    }
}

运行代码后,我们得到以下输出:

Thread-0 --> 1
Thread-1 --> 2
Thread-0 --> 3
Thread-1 --> 4
Thread-0 --> 5

所有线程都有默认名称,如Thread-0Thread-1等。

2.1. 使用Thread构造函数

Thread类提供了一些构造函数,允许我们在创建线程时指定线程名称,例如:

  • Thread(Runnable target, String name)
  • Thread(String name)

这里的name参数就是线程名称。

使用Thread构造函数,我们可以在线程创建时为其提供自定义名称。

现在,让我们为我们的线程赋予自定义名称:

Thread oddThread = new Thread(() -> {
    test.printOddNumber();
}, "ODD");

Thread evenThread = new Thread(() -> {
    test.printEvenNumber();
}, "EVEN");

运行代码时,可以看到自定义名称:

ODD --> 1
EVEN --> 2
ODD --> 3
EVEN --> 4
ODD --> 5

2.2. 使用setName()方法

此外,**Thread类还提供了setName()方法。**

我们可以使用Thread.currentThread().setName()调用setName

Thread oddThread = new Thread(() -> {
    Thread.currentThread().setName("ODD");
    test.printOddNumber();
});

Thread evenThread = new Thread(() -> {
    Thread.currentThread().setName("EVEN");
    test.printEvenNumber();
});

也可以通过Thread.setName()直接调用:

Thread oddThread = new Thread(() -> {
    test.printOddNumber();
});
oddThread.setName("ODD");

Thread evenThread = new Thread(() -> {
    test.printEvenNumber();
});
evenThread.setName("EVEN");

再次运行代码,可以看到我们线程的自定义名称:

ODD --> 1
EVEN --> 2
ODD --> 3
EVEN --> 4
ODD --> 5

3. 总结

在这篇文章中,我们了解了如何在Java中设置线程名称。首先,我们创建了一个具有默认名称的线程,然后使用Thread构造函数和setName方法设置了自定义名称。

如往常一样,本文的示例代码可在GitHub上找到:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-concurrency-basic-2/