5

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

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

现在,我需要让它每隔几分钟运行一次;所以我的伙伴所做的是创建一个使用循环运行程序的脚本,休眠几分钟,然后重复。

最近,我的老板告诉我们,它很好,但希望整个程序完全独立于 java 中;这意味着它在java中循环和休眠。最重要的是,他希望每次运行程序时都由命令行确定睡眠持续时间。

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

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

看看java.util.ConcurrentAPI,特别是你可能对ScheduledExecutorService感兴趣

于 2012-07-26T19:40:48.633 回答
1

程序启动时在命令行设置一个系统属性:-Dmy.sleep.time=60000 然后获取那个参数:long mySleepTime = System.getProperty("my.sleep.time");

查看 Executor 框架。ScheduledExecutorService 有一个 scheduleWithFixedDelay 可能会做你想做的事(在执行之间有延迟运行你的代码)。

于 2012-07-26T19:35:43.177 回答
0

当您在 Java 中使用命令行参数运行某些东西时,它们会存储在主函数的参数 args 中,如下所示:

public static void main(String[] args)

如果您只有一个参数,并且它是一个数字,则可以使用以下方法将其转换为整数:

Integer.parseInt(args[0])

它将返回由存储为数组 args 的零元素的字符串表示的整数值。

编辑:请注意,当您调用 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 回答