5

私は、次のようなLinuxマシンでのJavaプログラムの設計に割り当てられています。

  1. データベースに接続します
  2. レコードを読み取ります
  3. 特定の情報を取得し、「threat_level」と呼ばれるフィールドに従ってNagiosに送信します
  4. 次のレコードを読み取り、すべてのレコードが読み取られるまでステップ番号3を繰り返します

今、私はこれを数分ごとに実行する必要がありました。そのため、私のパートナーが行ったのは、ループを使用してプログラムを実行し、数分間スリープして、繰り返すスクリプトを作成することでした。

最近、私の上司はそれは良いことだと言ったが、手順全体を完全にJavaに自己完結させたいと思っている。これは、Java内でループしてスリープすることを意味します。その上、彼はプログラムが実行されるたびにコマンドラインによってスリープ期間が決定されるようにしたいと考えています。

私はいくつかの調査を行いましたが、Thread.sleep()を使用することは特定の状況では非効率的であり、これがそれらの1つであるかどうかはわかりません。また、プログラムの実行時にコマンドラインからスリープ時間を決定する方法がまだわかりません。必要に応じてコードを提供できます。

4

4 に答える 4

22

Thread.sleep()特に「数分間」眠りたい場合は、問題ありません。

public class Main {

    public static void main(String[] args) throws InterruptedException {
        final int sleepSeconds = Integer.parseInt(args[0]);
        while(true) {
            //do your job...
            Thread.sleep(sleepSeconds * 1000);
        }
    }

}

Thread.sleep()ミリ秒の時間範囲では非効率的または十分に正確でない可能性がありますが、あなたの場合はそうではありません。ただし、プロセスを同じ頻度で (固定遅延ではなく) 実行する場合は、次のことを考慮してください。

final long start = System.currentTimeMillis();
//do your job...
final long runningTime = System.currentTimeMillis() - start;
Thread.sleep(sleepSeconds * 1000 - runningTime);

これは重要であり、「仕事をする」部分にはかなりの時間がかかる可能性があり、正確な頻度でプロセスが必要です。

また、読みやすさのためにTimeUnitクラスを検討してください(Thread.sleep()下で使用):

TimeUnit.SECONDS.sleep(sleepSeconds);
于 2012-07-26T19:35:33.290 に答える
2

APIを見てくださいjava.util.Concurrent。特に、ScheduledExecutorServiceに興味があるかもしれません。

于 2012-07-26T19:40:48.633 に答える
1

プログラムの開始時にコマンド ラインでシステム プロパティを設定します。 -Dmy.sleep.time=60000 次に、そのパラメータを取得します。

Executor フレームワークを見てください。ScheduledExecutorService には、おそらく必要なことを実行する scheduleWithFixedDelay があります (実行の間に遅延を置いてコードを実行します)。

于 2012-07-26T19:35:43.177 に答える
0

コマンドライン引数を使用して Java で何かを実行すると、次のようにメイン関数のパラメーター引数に格納されます。

public static void main(String[] args)

引数が 1 つしかなく、それが数値の場合は、次を使用して整数に変換できます。

Integer.parseInt(args[0])

配列argsのゼロ要素として格納された文字列で表される整数値を返します。

EDIT:Java仮想マシンを呼び出すときにコマンドライン引数を送信することに注意してください:

java MyCompiledFile arg0 arg1 arg2

MyCompiledFile は実行するファイルの名前であり、arg0、arg1、および arg2 (必要な数の引数を持つことができます) は、args[0]、args[1]、および args に入る文字列です。 [2] main に渡されるパラメーター。複数のディレクトリに複数のファイルがある場合は、クラスパス (ファイルを含むすべてのディレクトリを含むディレクトリ) を指定する必要があります。(これらはバイナリ ファイルであり、ソース ファイル自体ではなく、ソース ファイルをコンパイルした結果であることに注意してください)。その場合は、次を使用します。

java -cp MyClassPath MyCompiledFile arg0 arg1 arg2

MyClassPath は Linux クラスパス (/home/usr/bin など) です。

于 2012-07-26T19:35:51.803 に答える