0

我正在做一个优化问题,我想在固定的时间段内使用随机参数执行每个 Solver 线程(一次一个)。如果任何线程成功找到解决方案,它将返回并且程序将退出。

我在下面的代码中使用了 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,具有适当数量的底层线程,并将你所有的任务提交给那个唯一的 ExecutorService。

另请注意,如果您的任务花费的时间超过 1 秒,并且如果它们在中断时没有立即终止,那么您最多可以同时运行 300 个 ExecutorServices 和 300 个 Solver 任务。根据您的 Solver 占用多少内存,这可能会导致 OOME。

于 2013-06-26T09:31:56.803 回答