2017-05-11 6 views
0

私はシンプルなコンソールアプリケーションで作業していますが、次の問題があります。ユーザがアプリケーションを閉じるときに操作を傍受して実行する必要があります(たとえば、シェルでCTRL + Cをクリック)。ユーザーがJavaコンソールアプリケーションを終了したときに、正しく傍受して処理する方法は?

addShutdownHook()メソッドを実行時に使用できます(ただし、このアサーションについては絶対にわかりません)が、私にとっては機能しません。

私はこのような何か行っている:私は、アプリケーションが起動し、ユーザーがCTRL + Cすることにより、アプリケーションを終了すると、それは実行に入力する必要があることが予想このようにすること

public class MainApp { 

    public static void main(String[] args) { 

     Runtime.getRuntime().addShutdownHook(new Thread() 
     { 
      @Override 
      public void run() 
      { 
       System.out.println("STOPPED !!!"); 
      } 


     }); 

     ................................................................... 
     ................................................................... 
     MY APPLICATION BEHAVIOR 
     ................................................................... 
     ................................................................... 
    } 
} 

を()メソッドは新しいスレッド()に定義された

何が起こるかというと、私はCTRL + Cを押して自分のアプリケーションを終了した場合、アプリケーションがBを終了することですut run()メソッドが実行されないため、アプリケーションの終了が処理されません

何が問題なのですか?私は何が欠けていますか?ユーザーがコンソールアプリケーションを終了したときに、どのように正しく傍受することができますか?

+0

@RealSkeptic私は間違った主張をした、私は私の元の投稿を編集しました。基本的には、アプリケーションが正常に起動しますが、CTRL + Cで終了すると、アプリケーション終了は処理されず、run()メソッドは実行されません。 –

+0

「アプリケーション動作」の部分について詳しく教えてください。それは何をするためのものか?おそらく、それはたくさんのものを印刷するので、シャットダウンフックからプリントが見えないでしょうか? – RealSkeptic

答えて

1

docsで述べたようにaddShutDownHook()メソッドは、ユーザーはCtrl + Cの前に呼び出されるべきであることに注意してください、私は以下のコードを試してみましたとCtrl + Cを押したときに、それは私のために働いている:

シャットダウンシーケンスが開始されると、新しいシャットダウンフックを登録したり、以前に登録したフックを登録解除することは不可能です。これらの操作のいずれかを試行すると、IllegalStateExceptionがスローされます。

public class MainApp { 

    public static void main(String[] args) { 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
       try { 
        String text = "kkkk"; 
        Files.write(Paths.get("./fileName.txt"), text.getBytes()); 
        System.out.println("STOPPED !!!"); 
       } catch (IOException ex) { 

        ex.printStackTrace(); 
       } 
      } 

     }); 

     Scanner sc = new Scanner(System.in); 
     int i = sc.nextInt(); 

     System.out.println("the entered int: " + i); // will print the variable 



     System.out.println("my app behaviour"); 

    } 
} 

アプリが起動し、私は、ファイルが現在のディレクトリに書き込まれ、私は次の出力見ることができるのCtrl + Cを押します。

Pedros-のMacBook-Proの:StackOverflowののペドロ$をjava -jar target/stackoverflow-1.0-jar-with-dependencies.jar ^ CSTOPPED !!!

関連する問題