2013-06-26 66 views
0

我正在做一個優化問題,我想在一段固定的時間內用隨機參數執行每個Solver線程(一次一個)。如果任何線程成功找到解決方案,它將返回並且程序將退出。ExecutorService Execptions和內存泄漏?

我在下面的代碼中使用了ExecutorService和Future來幫助我完成此操作。但是,由於某些原因,程序的內存使用量會隨着時間的推移而線性增加,並且在程序變得非常遠之前程序將以OutOfMemory錯誤終止。我的求解器代碼當然不是問題,因爲它沒有靜態變量並且使用恆定的內存量。我想知道是不是因爲我沒有清理線程或正確處理異常,但似乎無法從代碼中找到任何令人震驚的問題。

public class RandomizedSolver { 
    public static void main(String[] args) { 
     try { 
      for (int i = 0; i < 300; i++) { 
       ExecutorService executor = Executors.newSingleThreadExecutor(); 
       try { 
        System.out.println("Starting new thread"); 
        Future<Void> future = executor.submit(new Solver(args)); 
        future.get(1, TimeUnit.SECONDS); 
        executor.shutdownNow(); 
        break; 
       } catch (TimeoutException e) { 
        System.out.println("Thread timeout."); 
        executor.shutdownNow(); 
        continue; 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

什麼是Solver類? – Andremoniy

回答

2

使用ExecutorServices的重點是重用其線程,而不是重新創建它們。您應該修改您的設計,並且只有一個ExecutorService和適當數量的基礎線程,並將所有任務提交給該唯一的ExecutorService。

另請注意,如果您的任務花費的時間超過1秒,並且中斷時沒有立即終止,則最多可同時運行300個ExecutorServices和300個求解器任務。取決於Solver需要多少內存,這可能會導致OOME。