Java でスレッド ID を取得

Rupam Yadav 2023年10月12日
  1. Java で Thread.getId() を使ってスレッド ID を取得する
  2. Java の Thread.currentThread().getId() を使用して現在のスレッドプールの ID を取得する
Java でスレッド ID を取得

このチュートリアルでは、Java でスレッドの id を取得する方法を紹介します。また、スレッドプールから現在のスレッドの ID を取得する方法も見ていきます。

Java で Thread.getId() を使ってスレッド ID を取得する

この例では、スレッドを実行するために run() メソッドが必要なので、Runnable クラスを実装した Task クラスを作成しました。クラス Task はコンストラクタからスレッド名を受け取り、run() メソッドはスレッドが実行されたときにそれをコンソールに表示します。

main() メソッドでは、コンストラクタで 2つの Task オブジェクトを作成し、その中に task1task2 を渡してタスクを割り当てるスレッドオブジェクトを 2つ作成します。

スレッドを実行するために thread1thread2 を使って start() メソッドを呼び出します。最後に、スレッドが実行されたら、thread.getId() を使って各スレッドの ID を取得し、その ID を long で返します。

public class GetThreadID {
  public static void main(String[] args) {
    Task task1 = new Task("Task 1");
    Task task2 = new Task("Task 2");

    Thread thread1 = new Thread(task1);
    Thread thread2 = new Thread(task2);

    thread1.start();
    thread2.start();

    System.out.println("Thread1's ID is: " + thread1.getId());
    System.out.println("Thread2's ID is: " + thread2.getId());
  }
}

class Task implements Runnable {
  private String name;

  Task(String name) {
    this.name = name;
  }

  @Override
  public void run() {
    System.out.println("Executing " + name);
  }
}

出力:

Thread1's ID is: 13
Thread2's ID is: 14
Executing Task 2
Executing Task 1

Java の Thread.currentThread().getId() を使用して現在のスレッドプールの ID を取得する

スレッドプールは、タスクの実行が重くなる場合に有益です。下の例では、Executors.newFixedThreadPool(numberOfThreads) を使ってスレッドプールを作成しています。プールに入れるスレッドの数を指定することができます。

クラス Taskrun() メソッドでスレッドの実行を担当します。コンストラクタで渡されたスレッドの名前を設定して取得するシンプルなクラスです。複数のタスクを作成するには、for ループを使って 5つの task オブジェクトを作成し、プール内で 5つのスレッドを実行します。

目的は現在実行されているすべてのスレッドの ID を取得することです。これを行うには、現在のスレッドの ID を返す Thread.currentThread().getId() を使用します。出力では、個々のタスクを実行しているすべてのスレッドの ID を見ることができます。

タスクが完了したら、threadExecutor.shutdown() を使ってスレッドプールの実行を停止します。スレッドプールが終了するまで待つには、!threadExecutor.isTerminated() を使用します。

package com.company;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class GetThreadID {
  public static void main(String[] args) {
    int numberOfThreads = 5;

    ExecutorService threadExecutor = Executors.newFixedThreadPool(numberOfThreads);

    for (int i = 0; i < 5; i++) {
      Task task = new Task("Task " + i);

      System.out.println("Created Task: " + task.getName());
      threadExecutor.execute(task);
    }
    threadExecutor.shutdown();

    while (!threadExecutor.isTerminated()) {
    }

    System.out.println("All threads have completed their tasks");
  }
}

class Task implements Runnable {
  private String name;

  Task(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  @Override
  public void run() {
    System.out.println("Executing: " + name);
    System.out.println(name + " is on thread id #" + Thread.currentThread().getId());
  }
}

出力:

Created Task: Task 0
Created Task: Task 1
Created Task: Task 2
Created Task: Task 3
Created Task: Task 4
Executing: Task 0
Executing: Task 2
Executing: Task 1
Executing: Task 4
Executing: Task 3
Task 0 is on thread id #13
Task 1 is on thread id #14
Task 4 is on thread id #17
Task 2 is on thread id #15
Task 3 is on thread id #16
All threads have completed their tasks
著者: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

関連記事 - Java Thread