在 Java 中获取线程 ID

Rupam Yadav 2023年1月30日 2020年12月31日
  1. 在 Java 中使用 Thread.getId() 获取线程 id 的方法
  2. 在 Java 中使用 thread.currentThread().getId() 获取当前线程池的 id
在 Java 中获取线程 ID

在本教程中,我们将介绍 Java 中获取线程 id 的方法。我们还将看到如何从线程池中获取当前线程的 id。

在 Java 中使用 Thread.getId() 获取线程 id 的方法

在这个例子中,我们创建了一个实现了 Runnable 类的 Task 类,因为我们需要它的 run() 方法来执行线程。Task 类从它的构造函数中获取一个线程名,run() 方法在执行时将其打印在控制台。

main() 方法中,我们在构造函数中创建了两个 Task 对象,然后创建两个线程对象,其中传递 task1task2 来分配任务。

我们将使用 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) 创建一个线程池。我们可以指定池中我们想要的线程数量。

Task 类负责执行 run() 方法中的线程。它是一个简单的类,可以设置和获取在构造函数中传递的线程名称。为了创建多个任务,我们使用一个 for 循环,在这个循环中创建五个 task 对象,并在池中执行五个线程。

我们的目标是获取当前正在执行的每个线程的 id。为此,我们将使用 Thread.currentThread().getId() 来返回当前线程的 id。在输出中,我们可以看到执行各个任务的所有线程的 id。

一旦任务完成,我们应该使用 threadExecutor.shutdown() 停止执行线程池。!threadExecutor.isTerminated() 用来等待 threadExecutor 停止。

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
Author: 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