シャットダウン フック (JVM が停止しているときに実行されるコード) を設定します。
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
// print stuff here
}
}));
実行を停止するには、ユーザーにctrlcコマンド ラインで入力してもらいます。JVM が停止すると、フックが実行されて、好きなものが出力されます。
編集:
上記は残忍ですが単純ですが、JVM全体を終了させたくない場合は、「サーバーイベント」の領域に入って動作を駆動することになります。これは、アクションを引き起こすために多くの形式を取ることができます:
- 別のスレッドでワーカー タスクを実行し、ターミナルでコマンドがそのスレッドを停止 (またはその他のアクション) するのを待つ - これは私が最初に試すことであり、これを行うことは非常に教育的です。
- ファイルシステムを監視して、ファイルの存在/不在を探します (不十分ですが、最小限のコードで動作します)
- メッセージのポートをリッスンするため、通常は Web サーバーの HTTP ポートが最適な武器ですが、サーバー側で少し重くなり始めています。
- メッセージの JMS キューを監視する - 私たちは Java EE 空間にいますが、さらに重いものがあります
- 実装したいその他の「状態の変化」
編集2:
これは、シャットダウン フックを使用して機能する最小限の実装です (コマンド ラインで開始し、 を押しctrlcて終了し、計算コードを実行します)。
public static void main(String[] args) throws Exception {
final long start = System.currentTimeMillis();
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
double hours = (System.currentTimeMillis() - start) / 3600000d;
System.out.println("Please enter the hourly rate");
double hourlyRate = new Scanner(System.in).nextDouble();
System.out.format("Program ran for %01.3f hours and cost $%02.2f", hours, hourlyRate * hours);
}
}));
Thread.sleep(Long.MAX_VALUE); // Sleep "forever"
}