一定期間、ランダムなパラメーターを使用して各ソルバー スレッドを (一度に 1 つずつ) 実行する最適化問題を実行しています。いずれかのスレッドが解決策を見つけることに成功した場合、そのスレッドは戻り、プログラムは終了します。
これを達成するために ExecutorService と Future を使用した以下のコードがあります。ただし、何らかの理由で、プログラムのメモリ使用量は時間が経つにつれて直線的に増加し、プログラムは非常に遠くに到達する前に OutOfMemory エラーで終了します。私の Solver コードは、静的変数がなく、一定量のメモリを使用するため、確かに問題ではありません。スレッドをクリーンアップしていないか、例外を適切に処理していないためかどうか疑問に思っていますが、コードから重大な問題を見つけることができないようです。
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();
}
}
}