1. 概要

このチュートリアルでは、Javaでスレッドの名前を設定するさまざまな方法を見ていきます。 最初に、2つのスレッドを実行する例を作成します。 1つは偶数のみを出力し、もう1つは奇数のみを出力します。 次に、スレッドにカスタム名を付けて表示します。

2. スレッドの名前を設定する方法

スレッドは、同時に実行できる軽量プロセスです。 JavaのThreadクラスは、スレッドのデフォルト名を提供します。

場合によっては、実行中のスレッドを知る必要があることがあります。そのため、スレッドにカスタム名を付けると、実行中の他のスレッドの中から簡単に見つけることができます。

2つのスレッドを作成する単純なクラスを定義することから始めましょう。最初のスレッドは、1からNまでの偶数を出力します。 2番目のスレッドは、1からNまでの奇数を出力します。 この例では、Nは5です。

スレッドのデフォルト名も出力します。

まず、2つのスレッドを作成しましょう:

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()
}

ここでは、printEvenNumberメソッドとprintOddNumberメソッドの両方で、現在の数値が偶数か奇数かを確認し、Thread名と一緒に数値を出力します。

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-0、Thread-1、などです。

2.1. スレッドコンストラクターの使用

Threadクラスは、スレッドの作成中にスレッド名を提供できるいくつかのコンストラクターを提供します

  • スレッド(実行可能なターゲット、文字列名)
  • スレッド(文字列名)

パラメータname、この場合はは、Thread名です。

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 を作成し、次に Thread コンストラクターを使用してカスタム名を設定し、後でsetNameメソッドを使用してカスタム名を設定しました。

いつものように、この記事のサンプルコードは、GitHubから入手できます。