2012-07-26 68 views
4

我被分配在Linux机器上设计一个Java程序:获得的Java环之间睡觉,睡眠时间指定由命令行上的Linux

  1. 连接数据库
  2. 读取记录
  3. 检索某些信息发送给Nagios根据被称为“threat_level”
  4. 下一个读取记录,并重复步骤3号场,直到所有的记录都被读取

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

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

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

+2

为什么你关心效率,如果你在一个时间停止几分钟整个程序? – CosmicComputer 2012-07-26 19:33:37

+0

嗯,这只是我在研究过程中看到的几次。对此我仍然没有清楚的认识。 – 2012-07-26 19:36:40

+1

如果您可以在Java API中找到一个效率非常低的命令,以至于相对于您睡觉的几分钟而言浪费足够的时间来保持重要,那么我会吃掉我的帽子。我没有戴帽子,但我认为这样的命令不太可能,因此我打算出去买帽子,然后消费。 – CosmicComputer 2012-07-26 19:39:19

回答

17

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); 
+0

这是非常有帮助和很好的解释,非常感谢你 – 2012-07-26 19:51:47

+0

我会upvote,但我目前没有足够的声誉这样做,对不起。 – 2012-07-26 20:08:28

+0

我一直在努力但是使用你的建议的方法,我得到一个异常: 异常线程“main” java.lang.ArrayIndexOutOfBoundsException:0 在SnortMonitor.main(SnortMonitor.java:26) 我想这是由于我在命令行输入我的参数的方式,但我不太确定。我正在使用linux并输入5美元,以便每5秒测试一次 – 2012-07-26 22:04:02

1

设置在命令行上的系统属性的程序启动时:-Dmy.sleep.time = 60000 然后得到那个参数:long mySleepTime = System.getProperty(“my.sleep.time”);

看看Executor框架。 ScheduledExecutorService有一个scheduleWithFixedDelay,它可能会做你想做的事(在执行过程中延迟执行你的代码)。

0

当运行在Java中使用命令行参数的东西,它们被存储在主函数中的参数指定参数时,如:

如果你只有一个参数,它是一个数字,可以通过使用将其转换成一个整数:

Integer.parseInt(args[0]) 

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

编辑:请注意,您发送的命令行参数,当你调用Java虚拟机:

java MyCompiledFile arg0 arg1 arg2 

哪里MyCompiledFile是要运行该文件,并为arg0,ARG1和ARG2名(你可以拥有任意数量的参数)是参数传递给main的参数args [0],args [1]和args [2]中的字符串。如果在多个目录中有多个文件,则需要指定一个类路径 - 一个包含所有包含文件的目录的目录。 (请注意,这些是二进制文件,是编译源文件的结果,而不是源文件本身)。在这种情况下,使用:

java -cp MyClassPath MyCompiledFile arg0 arg1 arg2 

其中MyClassPath是Linux类路径(例如/ home/usr/bin)。

+0

好的,所以当我在linux中运行程序时,然后我会输入我想要的时间延迟?或者是否有一些bash命令需要使用?对不起,我对linux非常陌生,我的合作伙伴一直主要在linux端进行处理,而我试图尽可能多地获取信息。 – 2012-07-26 19:51:22

+0

您输入命令行参数与程序运行的命令;看到我的帖子的编辑。 – CosmicComputer 2012-07-26 19:52:47

+0

啊,我明白了,谢谢你,很好的解释。然而它提出了另一个问题。目前我有一个名为'testrun'的简短脚本,它与我所有的jar和src文件一起编译,因此我不需要添加每个路径。另外,我有一个名为'testrun2'的脚本,它以相同的方式运行它。这是否会导致将参数传递到java中的问题?有没有更好的方法来编译和运行? – 2012-07-26 20:07:29