我遇到ThreadPoolExecutor问题。有一个包含许多文件名的列表。 我想用多线程处理这些文件。我一次只想要2个或4个线程(取决于处理器)。有时如果文件很长,我会遇到内存异常。 我没有结果地调查了这个问题......
代码:
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 2,
0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(20));
我将文件名存储在列表中,然后逐个遍历列表并调用execute()
方法。
for(String fileName : fileNames) {
executor.execute(new FileProcess(fileName));
}
然后shutdown()
poolThread并等待每个线程完成。
if (ProjectsHandler.withThread){
executor.shutdown();
while(!executor.isTerminated()) {
// wait until all threads are finish
}
}
所以我给出了内存异常。分析器说原因是ThreadPoolExecutor。 如果我用1个线程运行程序一切正常,没有例外。
可能是什么问题? 提前致谢
答案 0 :(得分:1)
我不认为问题与线程有关。如果你并行运行两个任务,并且它们都需要256MB,而你只有384MB(例如),那么你的内存就会耗尽。如果按顺序运行它们,没有线程,你会没事(但需要更长时间)。
您应该查看内存不足异常的原因。尝试减少JVM可用的内存,直到单线程版本触发它为止。这样可以更容易调试。
答案 1 :(得分:0)
如果我不得不猜测,我敢打赌你的FileProcess
类读入你正在处理的文件的全部内容并将其存储在内存中的集合中。我还猜测你正在使用默认内存启动JVM,而不是那么多。
在启动程序时,尝试使用-Xmx 1024M
作为JVM命令行参数的一部分。