1. Overview
In this tutorial, we'll look at different ways to set the name of a Thread in Java. First, we'll create an example of running two Threads. One prints only even numbers, and the other only odd numbers. Then, we'll give our Threads a custom name and display them.
2. Ways to Set Thread Name
A Thread is a lightweight process that can execute concurrently. The Thread class in Java provides a default name for threads.
In some cases, we may need to know which thread is running, so giving a custom name to a Thread can make it easier to spot among other running threads.
Let's start by defining a simple class that creates two Threads. The first Thread will print even numbers between 1 and N. The second Thread will print odd numbers between 1 and N. In our example, N is 5.
We'll also print the Thread default names.
First, let's create two Threads:
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()
}
Here, in both the printEvenNumber and printOddNumber methods, we'll check if the current number is even or odd and print the number along with the Thread name:
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();
}
}
}
Running the code gives us the following output:
Thread-0 --> 1
Thread-1 --> 2
Thread-0 --> 3
Thread-1 --> 4
Thread-0 --> 5
All threads have a default name, Thread-0, Thread-1, and so on.
2.1. Using the Thread Constructor
The Thread class provides some constructors where we can provide the Thread name during the Thread creation, such as:
- Thread(Runnable target, String name)
- Thread(String name)
The parameter name, in this case, is the Thread name.
Using the Thread constructor, we can provide the thread name at the thread creation time.
Let's give a custom name for our Threads:
Thread oddThread = new Thread(() -> {
test.printOddNumber();
}, "ODD");
Thread evenThread = new Thread(() -> {
test.printEvenNumber();
}, "EVEN");
Now, when we run our code, the custom names are displayed:
ODD --> 1
EVEN --> 2
ODD --> 3
EVEN --> 4
ODD --> 5
2.2. Using the setName() Method
Additionally, the Thread class provides a setName method.
Let's call setName via Thread.currentThread().setName() :
Thread oddThread = new Thread(() -> {
Thread.currentThread().setName("ODD");
test.printOddNumber();
});
Thread evenThread = new Thread(() -> {
Thread.currentThread().setName("EVEN");
test.printEvenNumber();
});
Also, via Thread.setName() :
Thread oddThread = new Thread(() -> {
test.printOddNumber();
});
oddThread.setName("ODD");
Thread evenThread = new Thread(() -> {
test.printEvenNumber();
});
evenThread.setName("EVEN");
Again, running the code shows the custom name of our Threads:
ODD --> 1
EVEN --> 2
ODD --> 3
EVEN --> 4
ODD --> 5
3. Conclusion
In this article, we looked at how we can set the name of a Thread in Java. First, we created a Thread with the default name, then set a custom name using the Thread constructor and later with the setName method.
As always, the example code for this article is available over on GitHub.
res – REST with Spring (eBook) (everywhere)