问题描述
|
我对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个线程运行该程序,一切正常,也不例外。
可能是什么问题呢?
提前致谢
解决方法
如果我不得不猜测,我敢打赌,您的
FileProcess
类将读取您正在处理的文件的全部内容,并将其存储在内存中。我还会猜到您是用默认内存启动了JVM,而这并不是那么多。
启动程序时,尝试将ѭ6用作JVM命令行参数的一部分。
, 我认为问题与线程无关。如果您并行运行两个任务,并且两个任务都需要256MB,而您只有384MB(例如),则会用完内存。如果按顺序运行它们而没有线程,则可以(但是会花费更长的时间)。
您应该查看内存不足异常的原因。尝试减少JVM可用的内存,直到单线程版本触发它为止。这将使调试更加容易。