1

これは以前にも尋ねられたように聞こえるかもしれませんが、通常とは少し異なります。典型的なことはしたくありません (ユーザーがプログラムを実行した後、「もう一度やりたいですか?」と尋ねてもらいたい)。(私が達成した特定の文字列を入力することによって) プロセスを開始し、ユーザーが停止するまで無限に実行したいと考えています。それがいつまで続くかを知る方法はありません。このプログラムはたまたまタイマーです。そのため、実行されている時間を計算し、ユーザーがいつでも停止できるようにし、実行時間を出力する必要があります。

今のところ、UI/GUI は使用していません。できるだけシンプルに保ちます。

4

2 に答える 2

3

シャットダウン フック (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"
}
于 2012-04-18T01:13:10.453 に答える
0

デーモン true でスレッドを開始し、System.input の行を読み取ってから、スレッドを中断できますか。java.util.Timerも可能です。

于 2012-04-18T01:36:17.037 に答える