2017-09-26 9 views
2

私は私のプログラムの実行中のスレッドを表示するには、以下のコードを実行しているハング

public void printTasks() { 
    System.out.println("get threads start"); 
    for (Thread thread : Thread.getAllStackTraces().keySet()) { 
     //This block filters the non-java threads running 
     if (!thread.getThreadGroup().getName().equals("system")) { 
      System.out.println("hello"); 
     } 
    } 
    System.out.println("get threads end"); 
} 
問題は時々、コードだけで、印刷後にハングすることを「スレッドを取得している

"Thread.getAllStackTraces()"というメッセージが表示されます。

注:私のプログラムはスレッドを使って一連のタスクを実行します。スレッドは〜70スレッドを生成し、ハングは断続的ですが、私がこの方法と呼ぶ6回または7回に1回だけ問題が現れる。

私の質問は:

  • これは既知の問題ですか?
  • この現象を防ぐ方法はありますか?
  • 実行中のスレッドをリストするより安全な方法はありますか?

編集:私は、Java 1.8を使用しています、問題はそれが断続的に両方のケースでは、LinuxのOELおよびWindows Serverで発生し、ソフトウェアは

は事前

にありがとうスタンドアロンのデスクトップアプリケーションとして実行されます
+1

あなたが実行しているのJavaのバージョンは何、そしてどのようなOS上で役に立てば幸い、不変オブジェクト

より良い解決策は歓迎ですが読むには?これはスタンドアロンのアプリケーションですか、何らかの種類のアプリサーバーですか? –

答えて

0

私はちょうど問題が何であるかを知った(少なくともこれは私の仮説です)。

実行中のスレッドを取得するためのコードに競合状態が発生していました。私のプログラムを作成し

スレッドは常に変化している、いくつかは、(1秒以下)他の人が時間の非常に短い期間で終了開始

スレッドとスタックトレースののHashMapを返すThread.getAllStackTraces()関数(ラインa)とし、次のライン(線b)私はスレッドのグループ名

for (Thread thread : Thread.getAllStackTraces().keySet()) { <--- a 
    if (!thread.getThreadGroup().getName().equals("system")) { <--- b 

を取得しようとしていたが、スレッドは二行目に達した前にそれが消えたように少し続いたので、私がしようとしてしまいましたで無効なキーを使用して地図から値を取得する(thi s)が競合状態だった

:場合は、あなたが前にこれを経験しなかった決して、あなたは結果

のために永遠に待って終わるかもしれない存在しないのHashMapの値を読み取ろう

ソリューション

スレッドがまだ第二のアプローチはになり

public void printTasks() { 
    System.out.println("get threads start"); 
    for (Thread thread : Thread.getAllStackTraces().keySet()) { 
     //This block filters the non-java threads running 
     if (Thread.getAllStackTraces().containsKey(thread) && //<--new line here 
      thread.getThreadGroup().getName().equals("system")) { 
      System.out.println("hello"); 
     } 
    } 
    System.out.println("get threads end"); 
} 

その属性を読み取ろうとする前に存在することを確認しますgetAllStackTracesのコンテンツのスナップショットを取得しようと()これは誰か

関連する問題