2016-05-16 20 views
0

致命的な場合はいつでもアプリケーションをシャットダウンしようとしています。 エラー/例外が発生しましたが、アプリケーションをシャットダウンする前に現在の スレッド/ mainThread.join() run()の中に書かれています。その例外は例外ではありません。しかし、いつでも私の doTask()例外をスローする時間は、join()を永遠に待っています。例外が発生したときに永遠に待機しています。

public class POC 
{ 
    public void doTask() throws Exception 
    { 
     throw new Exception("Fatal Error"); 
     //throw new Exception("Fatal Error"); By commenting working fine. 
    } 

    public static void main(String[] args) 
    { 
     POC ob = new POC(); 
     final Thread mainThread = Thread.currentThread(); 
     Runtime.getRuntime().addShutdownHook(new Thread() 
     { 
      public void run() 
      { 
       try 
       { 
        System.out.println("Join() Start"); 
        mainThread.join(); 
        System.out.println("Join() End"); //Why this is not printing? 
       } 
       catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       }    
      } 
     }); 

     try 
     { 
      System.out.println("Before doTask()");   
      ob.doTask(); //User Defined Run() 
      System.out.println("After doTask()"); 
     } 
     catch (Exception ex)     // FATAL 
     { 
      System.err.println("Exception : " + ex.getLocalizedMessage()); 
      System.exit(-1); 
     } 
    } 
} 

OutPut : 0 
Before Run() 
Exception : Fatal Error 
Join() Start 

なぜSystem.out.println("Join() End");が印刷されないのですか?

+0

>私に教えてください。デッドロックを解除し、強制的にjvmをシャットダウンする解決策はありますか? –

答えて

1

シンプルなデッドロックがあります。 あなたがブロックしている例外、例外ハンドラの呼び出しSystem.exit(-1)を、投げる、Javadocを参照してください。

は、シャットダウンシーケンス

を開始することによって、現在実行中のJava仮想マシンを終了します...

仮想マシンのシャットダウンシーケンスは2つのフェーズから成ります。第1段階では、登録されているすべての#addShutdownHookシャットダウンフックがある場合は、指定されていない順序で起動され、が実行され、が終了するまで許可されます。すべてのシャットダウンフックが終了され、まで

だから、メインスレッドはSystem#exit呼び出しで待っている(System#exitに待っている... GOTO 1)あなただけシャットダウンフックブロックと、メインスレッドが終了しますまで待ち​​ます。

+0

>私に教えてください、デッドロックを解除し、強制的にjvmをシャットダウンする解決策はありますか? –

+1

@IndrajeetKumarSharmaは、シャットダウンフックのメインスレッドに参加しません。デッドロックにつながり、意味をなさない – qwwdfsad

関連する問題