2014-04-07 55 views
0

我想在文件列表上運行我的程序。但少數文件比預期時間長得多。所以我想在超時時間後終止線程/進程,並在下一個文件上運行程序。有沒有簡單的方法來做到這一點?我將一次只運行一個線程。如何在特定的時間內運行Java程序?

編輯1:

對不起,我不能早先說清楚。這是for循環代碼。

for (File file : files) 
{ 
    //Perform operations. 

} 

所以一個文件是可以包含很多方法的Java程序文件。如果方法數量少,我的分析工作正常。如果有很多說20種方法,它會繼續執行並分析它們幾個小時。所以在後一種情況下,我想完成該執行並轉到下一個java文件。

而且我沒有任何單線程約束。如果多線程工作,這對我仍然有好處。謝謝。

+0

在處理任何一個文件時,是否有幾點可以檢查所花費的時間?例如,每次你讀了另外10000行或類似的東西? –

+0

這是一個多線程程序嗎? – bstempi

+0

只有單線程。我只需要在一段時間後停止執行,並殺死它正在使用的所有資源,然後移動到下一個文件。 – Junaid

回答

3

這些事情通常做多線程。有關示例,請參閱How to timeout a thread

正如您所評論的,您正在尋找一種單線程解決方案。最好通過定期檢查超時是否到期來完成。某些線程必須執行檢查,並且由於您請求它只有一個線程,因此檢查必須位於代碼的中途。

假設大部分時間都在while循環中,逐行讀取文件。你可以做這樣的事情:

long start = System.nanoTime(); 
while((line = br.readLine()) != null) { 
    if(System.nanoTime() - start > 600E9) { //More than 10 minutes past the start. 
     throw new Exception("Timeout!"); 
    } 
    ... //Process the line. 
} 
+0

這樣的其他線程我認爲這是解決問題的好方法。然而,你是否有理由選擇nanoTime()而不是currentTimeMillis()是否是任意選擇? – anu

+1

處理一條線不太可能需要很長時間。您可能需要每隔一百行執行一次時間檢查,以減少系統調用。 – MirroredFate

+0

此外,由於OP的要求已經改變,他可以使用多線程,你能舉一個簡單的例子嗎?比方說,製作一個實現'Runnable'並由'ExecutorService'或者其他類執行的'ProcessFile'類? – MirroredFate

1

我想你有一段時間或for循環處理這些文件什麼關於每個循環讀取一個計時器。

你可以測量你有多長時間處理數據:

while(....){ 
     long start = System.currentTimeMillis(); 
     // ... the code being measured ...  
     long elapsedTime = System.currentTimeMillis() - start; 
} 

也許開始時計,我不知道循環之前

編輯: 所以,如果你有一個迴路轉文件中,您必須將索姆河時間度量值放在代碼中的某個特定點,比如說大流士。

例如:

for each file 
      start = System.currentTimeMillis(); 
      //do some treatment 
      elapsedTime = System.currentTimeMillis() - start; 
      // do a more tratment 
      elapsedTime = System.currentTimeMillis() - start; 
+0

我不認爲這將適用於此 –

+0

問題是代碼實際上分析文件。有時需要幾個小時才能完成。我只想運行10分鐘。如果尚未完成,請將其取消並移至下一個文件。 – Junaid

+0

如果你不能通過其他線程來測量流逝的時間,你必須測量大流士說的某個時間點所經過的時間。但我認爲一個更好的解決方案是與像MirroredFate – user43968

2

正如你將如何做到這一點使用多線程一個簡單的例子:

首先,我們做一個Runnable用於處理File

class ProcessFile implements Runnable { 
    File file; 
    public ProcessFile(File file){ 
     this.file = file; 
    } 
    public void run(){ 
     //process the file here 
    } 
} 

接下來我們實際執行該類作爲線程:

class FilesProcessor { 

    public void processFiles(){ 
     //I guess you get the files somewhere in here 
     ExecutorService executor = Executors.newSingleThreadExecutor(); 
     ProcessFile process; 
     Future future; 
     for (File file : files) { 
      process = new ProcessFile(file); 
      future = executor.submit(process); 
      try { 
       future.get(10, TimeUnit.MINUTES); 
       System.out.println("completed file"); 
      } catch (TimeoutException e) { 
       System.out.println("file processing timed out"); 
      } 
     } 
     executor.shutdownNow(); 
    } 
} 

因此w e遍歷每個文件並對其進行處理。如果花費時間超過10分鐘,我們會收到一個超時異常並且線程死亡。易如反掌。

+0

謝謝你的乾淨的代碼。我正在用GhostKeeper給出的鏈接以類似的方式嘗試代碼。所以我接受了他的回答。請不要介意:) – Junaid

+0

@Junaid不用擔心,他有一個很好的答案和一個有用的鏈接。很高興這可能是有用的。 – MirroredFate

相關問題