Javaマルチスレッド-スレッドの一意の識別(ID)は何ですか?

11088 ワード

結論threadSeqNumberはスレッドのIDであり、スレッドオブジェクトのgetId方法で取得することができる。
分析
データベースの中には、私達が表を作る時に、普通は唯一の標識をIDといいます。ThreadオブジェクトにもIDがあります。getIdを通じて取得できます。このIDは自己成長です。Threadソースコードを確認できます。以下は私が切り取ったコードセグメントです。
public class Thread implements Runnable {
    /* For generating thread ID */
    private static long threadSeqNumber;
    
    private static int threadInitNumber;

    private static synchronized long nextThreadID() {
        return ++threadSeqNumber;
    }

    private static synchronized int nextThreadNum() {
        return threadInitNumber++;
    }
}

コードからは、threadSeqNumberおよびthreadInitNumberの2つのIDが見られます。threadSeqNumberはスレッドのIDであり、このIDは同期して増加していることが見られます。Threadのinit方法では、スレッドごとにこのようなIDが割り当てられています。
private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc) {
      
     // ... (        )
     
     /* Set thread ID */
     tid = nextThreadID();
}
そして、threadInitNumberはスレッドに名前を付けていない場合、デフォルトではThread-Nというフォーマットでスレッドに名前をつけます。ここのNはthreadInitNumberです。Threadソースから下の構造関数が見られます。ここでは二つの関連構造だけを列挙します。
public Thread() {
    init(null, null, "Thread-" + nextThreadNum(), 0);
}
public Thread(String name) {
    init(null, null, name, 0);
}
ここで無参構造を採用すれば、Thread-Nという形式の標準名称が生まれます。threadInitNumberも増えます。もし我々が参構造を採用すれば、threadInitNumberはインクリメントされません。だから、私たちは愚かにしないでください。デフォルトの名前の後ろの数字を見てください。私たちは現在メインスレッドの下でこのように多くのスレッドを開いています。この数字がスレッドのIDだと思ってはいけません。この数字はIDとスレッド数と半角関係がありません。スレッドIDを取得すると、IDによってこのスレッドオブジェクトを取得することができます。以下のとおりです
public static void main(String[] args) throws Exception {
		
	//          ,   "my-thread"
	Thread myThread = new Thread(new Runnable() {
		public void run() {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}, "my-thread");
	myThread.start();
	long myThreadId = myThread.getId();
	System.out.println("my-thread  ID :" + myThreadId);
	
	//             ,     "my-thread"          ID
	//        activeCount enumerate  , API         
	Thread[] ts = new Thread[Thread.activeCount()];
	Thread.enumerate(ts);
	for(Thread t: ts) {
		if(t.getId() == myThread.getId()) {
			System.out.println("         my-thread   ,     :" + t.getName() + ",    : " + t.getState());
		}
	}
}
Threadを探しましたが、直接IDやNAMEでthreadオブジェクトを取得できる方法が見つかりませんでした。最終的にはこのような下手な方法を採用しました。このような方法が最適かどうかにかかわらず、私たちはIDによってサブスレッドオブジェクトを取得し、さらにこのサブスレッドを操作することができる。
なお、Thread.enumerateは、非NEWとTERMNATED状態のサブスレッドしか取れません。このコードは出力がないかもしれません。
(終わり)