2013-02-06 149 views
0

我有一個大的嵌套循環(深達6層),生成一個決策樹。然而,這是一個相當耗時的計劃,當時間到了,我需要中止這一代。嵌套循環和超時

我知道每個循環都有可能檢查定時器,但會降低效率。我正在考慮使用監視器線程或類似的機制,我想知道是否有一種有效的方法來設置整個循環的暫停和中斷(可能使用「goto」子句)?

或者我應該只是將嵌套循環切成嵌套線程?

+0

您是否嘗試過計算檢查超時的版本,以及沒有的版本? – thegrinner

+0

你是否真的試圖用定時器檢查來分析你的代碼?它通過了1%的工作時間嗎? – Dariusz

回答

2

只是如何效率低下來檢查System.currentTimeMillis()的時鐘值?我強烈懷疑它是微不足道的,這可能是您最簡單和最有效的選擇。

+1

在現代的JVM/hardwre上,你每秒可以完成數百萬個數據。我做了一個測試。 – Gray

+0

我有大約20個循環,在每個'for'或'while'循環中檢查'System.currentTimeMillis()'是一個好習慣嗎?我絕對可以這樣做,但我只是想知道是否會有更高效/直觀的方式來做到這一點? – Bonk

1

您可以測試檢查你的內心最環路的定時器,如果太慢其移動到,如果太慢你Level 4 ...

0

如果要停止整個如果它沒有完成一定的時間限制,則可以將所有循環放入一個線程,並允許該線程在特定時間運行,如果未完成則終止。下面是我會怎麼做:

Thread generationThread = new Thread(){ 

    public void run(){ 
     // All your loops 

     // You can check for isInterrupted and simply return to terminate the process 
     if(isInterrupted()){ 
      return; 
     } 
    } 
} 
generationThread.start(); 
generationThread.join(MAX_TIME); // how long in ms this process is allowed to run 
// Terminate the thread if it did not finish 
if(generationThread.isAlive()){ 
    generationThread.interrupt(); 
} 

這對於圖示碼只,根據需要改變它。