11

プログラムに4スレッドを使用する場合、通常は問題はありませんが、今日は8スレッドに増やし、1〜3スレッドが例外をスローせずに動作を停止することに気付きました。とにかく彼らが停止している理由を見つけるためにありますか?とにかくスレッドを再起動させる方法はありますか?

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

public void run()
{
  Main.logger.info(threadName + ": New Thread started (inside run)");
  while (true)
  {
    try
    {
      //all my code
      //all my code
      //all my code
    }
    catch(Exception e)
    {
      Main.logger.error("Exception: " + e);
      try
      {
        Thread.sleep(10000);
      }
      catch (InterruptedException e1)
      {
        e1.printStackTrace();
      }
    }
    finally
    {               
      try
      {
        webClient.closeAllWindows();
        Thread.sleep(3000); 
        Main.logger.info(threadName + ": Closed browser!");
      }
      catch (Exception e)
      {
        Main.logger.error("Exception: " + e);
      }
    }  
  }// end while
}

よろしく!

4

4 に答える 4

23

anは;でErrorないことに注意してください。ExceptionそれはThrowableです。
したがって、あなたがcatch Exception,Errorsそれでも通り抜ける場合:

private void m() {    
    try {
        m(); // recursively calling m() will throw a StackOverflowError
    } catch (Exception e) {
        // this block won't get executed, 
        // because StackOverflowError is not an Exception!
    }
}

「すべて」をキャッチするには、コードを次のように変更します。

try {
    ...
} catch (Throwable e) {
   // this block will execute when anything "bad" happens
}


エラーが発生した場合にできることはほとんどないことに注意してください。エラーの javadoc からの抜粋:

Error は、Throwable のサブクラスであり、合理的なアプリケーションがキャッチしようとすべきではない重大な問題を示します。このようなエラーのほとんどは異常な状態です。ThreadDeath エラーは、「通常の」状態ですが、ほとんどのアプリケーションがキャッチしようとしないため、Error のサブクラスでもあります。

于 2012-08-13T02:14:56.713 に答える
2

彼らがなぜ止まっているのかを知る方法はありますか?

それは少しトリッキーです。

Java スレッドは、次の 2 つの理由で終了する可能性があります。

  • run()メソッドから戻ることができ、
  • 例外がスローされ、スレッドのスタックでキャッチされないために終了する可能性があります。

run()スレッドに「UncaughtExceptionHandler」を使用することで後者のケースを検出できますが、イベントをログに記録するようにスレッドのメソッドを変更しない限り、前者のケースを確実に検出することはできません...またはそのようなものです。

何が起こっているのかを把握する別の方法は、デバッガーを JVM に接続し、キャッチされていない例外を報告するようにすることだと思います。

(例外が表示されない理由は、スレッドのrunメソッドがすべての例外をキャッチ/ログに記録しておらず、キャッチされていない例外ハンドラーがないためだと思います。)

とにかくスレッドを再起動する方法はありますか?

いいえ。終了したスレッドを再開する方法はありません。

于 2012-08-13T01:39:16.463 に答える
1

コマンド ラインから実行している場合は、すべてのスレッドの状態をコンソールにダンプできます。Windows では Ctrl+Break、Linux では 'kill' でプロセスに QUIT シグナルを送信してこれを行います。

Java スタック トレースの概要を参照してください。

Java 仮想マシンへのシグナルの送信 UNIX プラットフォームでは、kill コマンドを使用してプログラムにシグナルを送信できます。これは、JVM によって処理される終了シグナルです。たとえば、Solaris では、コマンド kill -QUIT process_id を使用できます。ここで、process_id は Java プログラムのプロセス番号です。

または、Java プログラムが開始されたウィンドウでキー シーケンス \ を入力することもできます。このシグナルを送信すると、JVM のシグナル ハンドラーに、JVM 内のスレッドとモニターに関するすべての情報を再帰的に出力するように指示されます。

Windows 95 または Windows NT プラットフォームでスタック トレースを生成するには、Java プログラムが実行されているウィンドウにキー シーケンスを入力するか、ウィンドウの [閉じる] ボタンをクリックします。

于 2012-08-13T01:38:38.363 に答える
0

そのうちの 1 つのスレッドの優先度が高すぎる可能性があります。同じレベルに設定してみてください。それらの間に何らかの制御がある場合、デッドロックが発生する可能性があります。

于 2012-08-13T02:48:04.807 に答える