具有修复池大小和许多任务的ThreadPoolExecutor

问题描述

| 我对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可用的内存,直到单线程版本触发它为止。这将使调试更加容易。