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