Generic Top

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE

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.

Generic bottom

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE
Generic footer banner
Comments are closed on this article!