2013-03-12 6 views
20

私はマルチスレッドのアプリケーションを持っていて、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; 
} 

上記機能は、すべての実行中のスレッドをチェックした後、スレッドを実行セットから所望のスレッドを返します。たぶん、私の希望のスレッドが中断され、上記の関数は動作しません。その機能を組み込む方法に関するアイデアはありますか?

+2

? –

+2

必要なスレッドを 'HashMap 'の名前で保存するだけです。 – millimoose

+0

@ JohnVint別のクラスで作成されているスレッドなので、直接アクセスできません。 – NullPointer

答えて

17

あなたはすべてを見つけることができますThreadGroup使用アクティブスレッド:

  • はUNT ThreadGroup.getParent()を呼び出すことにより、スレッドグループ階層をあなたの方法をワークアップあなたの現在のスレッドのグループ
  • を取得しますあなたはnullの親を持つグループを見つける。
  • ThreadGroup.enumerate()を呼び出して、システム上のすべてのスレッドを検索します。

これを行うことの価値は私を完全に逃げさせます...あなたは名前付きスレッドで何をするでしょうか? をサブクラス化して、Runnableを実装する必要がある場合を除き(これはまずは​​プログラミングが面倒です)。スレッドが作成されている方法

+0

これは、キャッチされない例外ハンドラを設定するために指定された名前を持つサードパーティのライブラリ(ソースコードは簡単に変更できないという意味)で定義されたローカル変数スレッド(リフレクションできません)を見つけることですここで例外がスローされたときにログを記録できませんでした)。これは非常に特殊なケースですが、このような状況の場合があります。 – Jyro117

+0

私のケースでは、スレッド安全性の問題が疑われるスレッドをデバッグするための単体テストを作成するために使用しています。問題のスレッドはRunnableを実装していますが、問題は次のようなものです:代替の答えは何ですか?あなたはどのように名前で特定のRunnableを取得しますか? –

5

私は最高のHashMapのアイデアを気に入っていますが、設定を維持したい場合は、あなたではなく、配列への変換の設定を通過するよりも、セットを反復処理することができます。

Iterator<Thread> i = threadSet.iterator(); 
while(i.hasNext()) { 
    Thread t = i.next(); 
    if(t.getName().equals(threadName)) return t; 
} 
return null; 
+1

これは上の例のように、スレッドが中断しても機能しません! – NullPointer

12

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

public Thread getThreadByName(String threadName) { 
    for (Thread t : Thread.getAllStackTraces().keySet()) { 
     if (t.getName().equals(threadName)) return t; 
    } 
    return null; 
} 
+0

スレッド数が多い可能性があります。 –

関連する問題