[英]How can I fix my program with ExecutorService?
所以,我是Java新手。
我编写了一个相对简单的程序,该程序可以处理大量文件。
速度很慢,我想运行多个线程。 在很少的StackOverflow社区帮助下,我做出了类似的事情:
public class FileProcessor {
public static void main(String[] args)
{
// run 5 threads
ExecutorService executor = Executors.newFixedThreadPool(5);
int i;
// get first and last file ID to process
int start = Integer.parseInt(args[0]);
int end = Integer.parseInt(args[1]);
for (i = start; i < end; i++)
{
final int finalId = i; // final necessary in anonymous class
executor.submit(new Runnable()
{
public void run()
{
processFile(finalId);
}
});
}
}
public static void processFile(int id)
{
//doing work here
}
}
这确实是一个非常简单的多线程解决方案,它可以满足我的要求。 现在,我想修复/改善它,因为我想我做错了(程序永无休止,使用的内存比应有的多,等等)。
我将减少数Runnable
在同一时间存在于内存中的对象? 如果应该-我该怎么做?
我如何检测到所有工作都已完成并退出程序(和线程)?
如果要减少运行的线程数,只需减小传递给固定线程池构造函数的大小即可。 至于终止,请在执行程序服务上调用shutdown和awaitTermination。 但这只会减少活动线程的数量,而不会减少您在循环中创建的Runnable的数量。
当您说program never ends, uses more memory than it should
,可能是由于多种原因,
1) processFile()
可能正在执行一些繁重的I / O操作(或者)它被某些I / O数据阻塞了。
2)如果存在任何公共数据对象共享,则可能存在潜在的死锁
您的线程逻辑本身,使用ThreadPoolExecutor
非常简单,我相信问题在于processFile()
的代码。
由于使用5初始化了池,因此ThreadPoolExecutor
确保只有5个活动线程在工作,而与要创建多少个线程无关。
因此,在这种情况下,我将重点放在应用程序逻辑优化上,而不是线程管理上。
如果你真的关心有多少Runnable
你要的对象来创建? 然后,这是您的应用程序需求和可用资源之间的权衡。
如果每个线程任务都是独立的,并且所有这些线程都有执行时间限制,那么您将在池中创建更多线程并添加更多资源。
当您定义一个时间限制为5个线程的PoolExecutor
并创建10,000个线程时,显然它们必须作为内存中的Future Task
等待,直到一个线程可用为止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.