让Java在循环之间休眠,在Linux上由命令行指定的休眠时间

exi*_*t_1 5 java linux command-line sleep

我被指派在linux机器上设计一个java程序:

  1. 连接到数据库
  2. 读取记录
  3. 检索某些信息并根据称为"threat_level"的字段发送到Nagios
  4. 读取下一条记录并重复步骤3,直到读完所有记录

现在,我需要每隔几分钟运行一次; 所以我的合作伙伴所做的是创建一个脚本,使用循环来运行程序,睡几分钟,然后重复.

最近,我的老板告诉我们它的好,但希望整个程序完全自包含在java中; 意味着它在java中循环和休眠.最重要的是,他希望每次运行程序时都可以通过命令行确定睡眠持续时间.

我做了一些研究,似乎在某些情况下使用Thread.sleep()是低效的,我无法判断这是否是其中之一.另外,我还不清楚如何在运行程序时通过命令行确定睡眠时间.如有必要,我可以提供代码.

Tom*_*icz 21

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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Thread.sleep()在毫秒时间范围内可能效率低或不够精确,但在您的情况下则不然.但是,如果您希望进程以相同的频率运行(而不是使用固定延迟),请考虑:

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

这很重要," 做你的工作 "部分可能需要花费大量时间,而且你希望这个过程具有准确的频率.

另外为了便于阅读,请考虑TimeUnit类(Thread.sleep()在下面使用):

TimeUnit.SECONDS.sleep(sleepSeconds);
Run Code Online (Sandbox Code Playgroud)