繁体   English   中英

如何使用ExecutorService修复程序?

[英]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
    }
}

这确实是一个非常简单的多线程解决方案,它可以满足我的要求。 现在,我想修复/改善它,因为我想我做错了(程序永无休止,使用的内存比应有的多,等等)。

  1. 我将减少数Runnable在同一时间存在于内存中的对象? 如果应该-我该怎么做?

  2. 我如何检测到所有工作都已完成并退出程序(和线程)?

如果要减少运行的线程数,只需减小传递给固定线程池构造函数的大小即可。 至于终止,请在执行程序服务上调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM