【问题标题】:Parallel processing of files并行处理文件
【发布时间】:2013-10-11 06:46:48
【问题描述】:

我有一个需要并行处理多个文件的要求,我已经完成了以下操作,它工作正常,但是我怎样才能使它更优化,期待任何建议。

long start = System.currentTimeMillis();
        File [] files=new File("C:\\ftp").listFiles();
        //System.out.println(files.length);
         ExecutorService executor=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
           // System.out.println("available processors.."+Runtime.getRuntime().availableProcessors());
        if(files.length>=1)
        {
            for(int i = 0;i<files.length; i++){
                System.out.println("reading..."+i);
                Runnable workerThread = new FileWorkerThread(files[i]);
               executor.execute(workerThread);
                          }
            executor.shutdown();
            while (!executor.isTerminated()) {
            }

//然后我有一个 run(),它基本上是读/写文件。这是一个好方法吗,有什么我可以做的让它变得更好。

【问题讨论】:

  • 关闭后使用executor.awaitTermination(...),而不是繁忙的循环。
  • 您的最后一个电话是忙等待,这是非常不好的做法。按照@Pyranja 的建议使用executor.awaitTermination(...)
  • 谢谢大家,我会做出改变,另外我必须在获得所需值后将文件的内容插入数据库,这会是关于数据库锁定或获取数据库连接的任何问题因为会有线程相互竞争以访问数据库。 @NishantShreshth,更好的是,它是否可以做得更优化,这样做需要更少的时间。
  • 这并没有你想象的那么多优势,除非处理是 CPU 密集型的。如果它是 I/O 绑定的,那么多线程没有优势:仍然只有一个磁盘。
  • 嗨 EJP,从文件中获取的数据会有很多复杂的逻辑处理,所以我想这符合多线程的目的..

标签: java multithreading thread-safety threadpool


【解决方案1】:

除了在 cmets 中已经解释的忙等待问题之外,代码没有明显的问题。因此,正如您所说,鉴于它工作正常,请问自己:是否需要更改它?您希望通过更改代码来改进哪些方面?

出乎意料的一些提示可以给你一些想法:

  • 创建 ExecutorService 是一项相当繁重的操作。但是您可以创建一次单一服务(例如在应用程序启动时)并在整个应用程序运行时重用它。

  • 如果您想将工作移出异步任务或从异步任务中收集结果,请考虑实现Callable&lt;T&gt; 接口而不是Runnable/Thread 并使用executor.submit(...)。它将返回一个Future&lt;T&gt;,它会在异步任务完成后立即保存结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多