0

一定期間、ランダムなパラメーターを使用して各ソルバー スレッドを (一度に 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();
        }
    }
}
4

1 に答える 1

2

ExecutorServices を使用するポイントは、スレッドを再作成し続けることではなく、スレッドを再利用することです。設計を修正し、適切な数の基になるスレッドを持つ ExecutorService を 1 つだけ用意し、すべてのタスクをその一意の ExecutorService に送信する必要があります。

また、タスクに 1 秒以上かかり、中断されたときにタスクがすぐに終了しない場合は、最大 300 の ExecutorServices タスクと 300 の Solver タスクを同時に実行できます。ソルバーが使用するメモリの量によっては、OOME が発生する可能性があります。

于 2013-06-26T09:31:56.803 に答える