2012-07-26 66 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