📜  如何在Java中获取当前正在运行的线程的 ID?

📅  最后修改于: 2022-05-13 01:55:03.714000             🧑  作者: Mango

如何在Java中获取当前正在运行的线程的 ID?

Thread 类的getId()方法返回被调用线程的标识符。线程 ID 是在创建该线程时生成的一个长正数。线程 ID 是唯一的,并且在其生命周期内保持不变。当一个线程终止时,这个线程 ID 可能会被重用。

Java允许在线程的帮助下并发执行程序的不同部分。 Java中的多线程是通过扩展 Thread 类或实现 Runnable 接口来实现的。由于Java中不允许多重继承,因此建议为线程创建实现 Runnable 接口,以便在需要时实现 Runnable 接口的类可以扩展某个其他类。在本文中,我们演示了创建线程的两种方法。第一种方法通过扩展 Thread 类显示线程创建,第二种方法显示通过实现 Runnable 接口创建线程。

宣言

public long getId()

返回值:该方法返回线程的ID。

方法一:以下是通过扩展Thread类来创建线程的步骤。

  1. ThreadDemo1 类扩展了 Thread 类并覆盖了 Thread 类的 run() 方法。
  2. 在 run() 方法中,我们使用currentThread().getName()方法来获取调用了 run() 方法的当前线程的名称。
  3. 我们使用currentThread().getId()方法来获取调用了 run() 方法的当前线程的 id。
  4. 在 main() 方法中,创建了 ThreadDemo1 类的两个实例。
  5. t1 和 t2 是调用 start() 方法的两个线程。
  6. 调用 start() 方法基本上默认调用 run() 方法。
  7. join() 方法用于防止 t2 在 t1 完成之前运行。
  8. 一旦 t1 完成,t2 就开始执行。

例子:

Java
// Java program to get the id of a 
// thread
  
import java.util.*;
public class ThreadDemo1 extends Thread {
    public void run()
    {
        // gets the name of current thread
        System.out.println(
            "Current Thread Name: "
            + Thread.currentThread().getName());
        
        // gets the ID of the current thread
        System.out.println(
            "Current Thread ID: "
            + Thread.currentThread().getId());
    }
    public static void main(String[] args)
        throws InterruptedException
    {
        Scanner s = new Scanner(System.in);
        
        // creating first thread
        ThreadDemo1 t1 = new ThreadDemo1();
        
        // creating second thread
        ThreadDemo1 t2 = new ThreadDemo1();
        
        // Starting the thread
        t1.start();
        t2.start();
        
        // t2 does not start execution until t1 completes
        // execution
        t1.join();
    }
}


Java
// Java program to get the id of a 
// thread
  
public class ThreadDemo2 implements Runnable {
    public void run()
    {
        // gets the name of current thread
        System.out.println(
            "Current Thread Name: "
            + Thread.currentThread().getName());
        
        // gets the ID of the current thread
        System.out.println(
            "Current Thread ID: "
            + Thread.currentThread().getId());
    }
    public static void main(String[] args)
    {
          // Runnable target
        ThreadDemo2 t = new ThreadDemo2();
        
          // create threads
        Thread t1 = new Thread(t, "First Thread");
        Thread t2 = new Thread(t, "Second Thread");
            
          // start threads
        t1.start();
        t2.start();
    }
}


输出
Current Thread Name: Thread-0
Current Thread Name: Thread-1
Current Thread ID: 11
Current Thread ID: 12

方法二:在第二种方法中,线程是通过实现Runnable接口来创建的。

  1. ThreadDemo2 类实现了 Runnable 接口并覆盖了 run() 方法。
  2. 创建了 ThreadDemo2 类 t 的可运行实例。
  3. 通过传递可运行实例作为第一个参数和线程的名称作为第二个参数来创建 Thread 类的两个实例
  4. start() 方法在两个线程上被调用
  5. start() 方法默认调用 run() 方法

例子:

Java

// Java program to get the id of a 
// thread
  
public class ThreadDemo2 implements Runnable {
    public void run()
    {
        // gets the name of current thread
        System.out.println(
            "Current Thread Name: "
            + Thread.currentThread().getName());
        
        // gets the ID of the current thread
        System.out.println(
            "Current Thread ID: "
            + Thread.currentThread().getId());
    }
    public static void main(String[] args)
    {
          // Runnable target
        ThreadDemo2 t = new ThreadDemo2();
        
          // create threads
        Thread t1 = new Thread(t, "First Thread");
        Thread t2 = new Thread(t, "Second Thread");
            
          // start threads
        t1.start();
        t2.start();
    }
}
输出
Current Thread Name: First Thread
Current Thread Name: Second Thread
Current Thread ID: 11
Current Thread ID: 12

注意:第二种方法的输出可能会有所不同,因为它不同步并且线程并发执行。因此打印线程名称或线程 id 的顺序可能会有所不同。为了防止这个问题,我们在第一种方法中使用了 join() 方法。如果要维护打印输出的顺序,则用户可以使用 join() 方法。