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

问题描述

如何获取正在运行的线程的 ID?

解决方案

以下示例演示如何使用 getThreadId() 方法获取正在运行的线程的 ID。

public class Main extends Object implements Runnable {
   private ThreadID var;
   public Main(ThreadID v) {
      this.var = v;
   } 
   public void run() {
      try {
         print("var getThreadID =" + var.getThreadID());
         Thread.sleep(2000);
         print("var getThreadID =" + var.getThreadID());
      } catch (InterruptedException x) {}
   } 
   private static void print(String msg) {
      String name = Thread.currentThread().getName();
      System.out.println(name + ": " + msg);
   } 
   public static void main(String[] args) {
      ThreadID tid = new ThreadID();
      Main shared = new Main(tid);
      try {
         Thread threadA = new Thread(shared, "threadA");
         threadA.start();
         Thread.sleep(500);
         
         Thread threadB = new Thread(shared, "threadB");
         threadB.start();
         Thread.sleep(500);
         
         Thread threadC = new Thread(shared, "threadC");
         threadC.start();
      } catch (InterruptedException x) {}
   }
}
class ThreadID extends ThreadLocal {
   private int nextID;
   public ThreadID() {
      nextID = 10001;
   } 
   private synchronized Integer getNewID() {
      Integer id = new Integer(nextID);
      nextID++;
      return id;
   } 
   protected Object initialValue() {
      print("in initialValue()");
      return getNewID();
   } 
   public int getThreadID() {
      Integer id = (Integer) get();
      return id.intValue();
   } 
   private static void print(String msg) {
      String name = Thread.currentThread().getName();
      System.out.println(name + ": " + msg);
   }
}

结果

上述代码示例将产生以下结果。

threadA: in initialValue()
threadA: var getThreadID = 10001
threadB: in initialValue()
threadB: var getThreadID = 10002
threadC: in initialValue()
threadC: var getThreadID = 10003
threadA: var getThreadID = 10001
threadB: var getThreadID = 10002
threadC: var getThreadID = 10003
java_threading.html