2

私は通常、約4つのスレッドでプログラムを実行し、プログラムが実行されてから1時間から10時間後に、いくつかのスレッドが停止して何もしません。例外とThrowableブロックの周りにプログラムがあり、スレッドのuncaughtExceptionもあり、何もありませんエラーに関するログファイルに追加されます。スレッドが停止する原因を特定するにはどうすればよいですか?

編集

ここに私のコードの基本的な構造があります

以下は、uncaughtException ブロックを設定するためのコードです。

                newThread.setName("Thread" + totalNumberOfThreads);
                newThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
                {
                    @Override
                    public void uncaughtException(Thread t, Throwable e)
                    {
                        Main.logger.info("ERROR! An exception occurred in " + t.getName() + ". Cause: " + e.getMessage());
                    }
                });
                newThread.start();

これがスレッドの基本構造です

@Override
public void run()
{               
  while (true)
  {
    try
    {               
      //a long section of code
    }
    catch (Exception e)
    {
      e.printStackTrace();
      Main.logger.info(threadName + ": " + e);
    }
    catch (Throwable t)
    {
      Main.logger.info(threadName + ": " + "Throwable: " + t);
    }
    finally
    {      
      //some code to close connections.. ect..
    }
  } // end while
}
4

4 に答える 4

3

スレッドが停止する原因を特定するにはどうすればよいですか?

スレッドが停止したという事実を知っていますか? 前述のとおり、ブロックされている可能性があります。それらがアクティブであるかどうかjstackを確認するか、詳細な検査のためにリモートデバッグを有効にしてプログラムを開始し、停止したと感じたらデバッガーをアタッチするために使用できます。

于 2012-10-19T22:35:14.520 に答える
1

デバッガーでプログラムを実行してみると、スレッドの状態を調べることができます。

Javaの組み込みのCtrl-BreakまたはCtrl-\メカニズムを使用することもできます。 「ハングまたはループ プロセスのトラブルシューティング」を参照してください。これにより、HotSpot VM はスレッド状態を含むスレッド ダンプを出力します。

于 2012-10-19T22:30:00.237 に答える
1

この問題はデッドロックを叫ぶだけです- それはすべての古典的な症状を示しています.

デッドロックとは、スレッド A がスレッド B の終了と一部のリソースの解放 (ロック) を待機しているときに、スレッド B がスレッド A の終了と一部のリソースの解放を待機している場合です。
デッドロックの詳細については、Java チュートリアルを参照してください。

これにより、両方のスレッドが実行を停止し、何も待機しなくなります。

デッドロックを検出するように設計されたプログラムを使用している場合でも、プログラムに実際にデッドロックがあるかどうかを確認することは、場合によっては非常に難しい場合があります。詳細については、Heisenbugを参照してください。

デッドロックを検出する最善の方法は、プログラムの抽象化を調べて、スレッド間のすべての依存関係をチェックし、依存関係で衝突が発生する可能性がある場所を確認することです。

PS もう 1 つの一般的な同期の問題は、データ競合です。

于 2012-10-19T22:35:28.597 に答える
0

まず、ExecutorService を調べて、コードを Callable に分割します。これにより、値を返したり、例外を発生させたりする機能を備えたスレッドで実行できます。その後、問題が発生した場合は再起動できます。

コードが例外および/またはThrowableをキャッチするときはいつでも、それは大きなコードの匂いです。チェックされた例外を超える例外はスローする必要があります。上記の呼び出し可能パターンを使用すると、取得内容を確認し、ログに記録して、(必要に応じて) 再起動できます。

于 2012-10-20T05:59:14.577 に答える