28

マルチスレッド アプリケーションがあり、プロパティを介して各スレッドに一意の名前を割り当てsetName()ます。ここで、スレッドに対応する名前で直接アクセスする機能が必要です。

次の関数のようなもの:

public Thread getThreadByName(String threadName) {
    Thread __tmp = null;

    Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
    Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);

    for (int i = 0; i < threadArray.length; i++) {
        if (threadArray[i].getName().equals(threadName))
            __tmp =  threadArray[i];
    }

    return __tmp;
}

上記の関数は、実行中のすべてのスレッドをチェックし、実行中のスレッドのセットから目的のスレッドを返します。目的のスレッドが中断されている可能性があります。その場合、上記の機能は機能しません。その機能を組み込む方法についてのアイデアはありますか?

4

4 に答える 4

25

ピートの答えの繰り返し..

public Thread getThreadByName(String threadName) {
    for (Thread t : Thread.getAllStackTraces().keySet()) {
        if (t.getName().equals(threadName)) return t;
    }
    return null;
}
于 2014-12-11T01:59:21.953 に答える
23

ThreadGroupを使用して、すべてのアクティブなスレッドを見つけることができます。

  • 現在のスレッドのグループを取得する
  • ThreadGroup.getParent()null の親を持つグループが見つかるまで呼び出して、スレッドグループの階層を上っていきます。
  • ThreadGroup.enumerate()システム上のすべてのスレッドを検索するために呼び出します。

これを行うことの価値は私には完全にわからない...名前付きスレッドで何をするつもりですか? Thread実装する必要があるときにサブクラス化していない限りRunnable(これは、最初はずさんなプログラミングです)。

于 2013-03-12T19:48:48.100 に答える
6

私は HashMap のアイデアが一番気に入っていますが、Set を保持したい場合は、配列に変換するセットアップを行うのではなく、Set を反復処理できます。

Iterator<Thread> i = threadSet.iterator();
while(i.hasNext()) {
  Thread t = i.next();
  if(t.getName().equals(threadName)) return t;
}
return null;
于 2013-03-12T19:30:23.257 に答える