2013-04-20 80 views
8

在Java中我有一個功能,以某種方式處理文本文件。但是,如果該過程花費太多時間,那麼對於該文本文件而言,該過程很可能是無用的(無論原因是什麼),我想跳過它。此外,如果過程耗時過長,它也會佔用太多內存。我已經試過這種方式來解決它,但它不工作:跳過功能,如果它需要太長時間

for (int i = 0; i<docs.size(); i++){ 
    try{ 
     docs.get(i).getAnaphora(); 
     } 
    catch (Exception e){ 
     System.err.println(e); 
    } 
} 

其中docs只是一個目錄中的文件的List。通常我必須手動停止代碼,因爲它被「卡住」在一個特定的文件上(取決於該文件的內容)。

是否有一種測量該函數調用時間的方法,並告訴Java跳過該函數花費的時間超過了比方說10秒?

編輯
刮幾下不同的答案在一起後,我想出了這個解決方案,它工作正常。也許別人也可以使用這個想法。

首先創建一個實現可運行(這樣如果需要的話,你可以在參數傳遞給Thread)類:

public class CustomRunnable implements Runnable { 

    Object argument; 

    public CustomRunnable (Object argument){ 
     this.argument = argument; 
} 

    @Override 
    public void run() { 
     argument.doFunction(); 
    } 
} 

然後用這個代碼在main類監控功能時(argument.doFunction() )和出口,如果它需要長期:

Thread thread; 
for (int i = 0; i<someObjectList.size(); i++){   
    thread = new Thread(new CustomRunnable(someObjectList.get(i))); 
    thread.start(); 
    long endTimeMillis = System.currentTimeMillis() + 20000; 
    while (thread.isAlive()) { 
     if (System.currentTimeMillis() > endTimeMillis) { 
     thread.stop(); 
     break; 
    } 
    try { 
     System.out.println("\ttimer:"+(int)(endTimeMillis - System.currentTimeMillis())/1000+"s"); 
     thread.sleep(2000); 
     } 
    catch (InterruptedException t) {} 
    } 
} 

我意識到stop()是depcecated,但我還沒有發現任何其他方式停止,當我希望它停止退出線程。

+1

看看這樣: [http://stackoverflow.com/questions/8982420/time-out-method-in-java][1] [1]:http://stackoverflow.com/questions/8982420/time-out-method-in-java – 2013-04-20 14:05:43

+0

這幫助我實現我的解決方案,謝謝:) – Tim 2013-04-20 17:14:58

回答

8

將代碼包裝在RunnableCallable中,並將其提交給合適的執行程序執行。其中一種提交方法需要一段超時時間,在該時間段之後,代碼已被中斷。

+0

我將是你最簡單的接口這似乎是解決問題的正確答案。但我不知道該怎麼做。我會看着它。 – Tim 2013-04-20 15:11:30

+0

你能舉個例子嗎? – CMCDragonkai 2013-11-09 21:02:37

0

您可以使用System.nanoTime()內部運行方法作爲條件。

例如,

long cur = System.nanoTime(); //records the time when start executing 
... 
double elapsedTime(System.nanoTime() - cur)/1000000.0; // at the end 
相關問題