java中的“简单”线程池

时间:2011-05-24 16:43:22

标签: java multithreading concurrency threadpool

我正在寻找一个能够保存我的工作线程的简单对象,我需要它不限制线程的数量,而不是让它们保持活动的时间超过需要的时间。 但我确实需要一个类似于ExecutorService.shutdown();的方法 (等待所有活动线程完成但不接受任何新线程)

所以也许线程池不是我需要的,所以我希望能朝着正确的方向努力。 (因为它们意味着保持线程活着)

进一步澄清意图:

每个线程都是一个文件的上传,我有另一个修改文件的进程,但它等待文件没有任何上传。通过加入每个线程。因此,当它们保持活着时,它会锁定该过程。 (每个线程在创建时将自己添加到特定文件的列表中,因此我只加入()上传特定文件的线程)

2 个答案:

答案 0 :(得分:6)

要做的事情的一种方法是使用CallableFuture来返回已完成上传的File对象。然后将Future传递给检查Callable并旋转的另一个Future.isDone(),直到它返回true,然后对文件执行任何操作。您的使用案例并非独一无二,非常适合java.util.concurrent package capabilities

一个有趣的课程是ExecutorCompletionService class,它可以完成你想要的等待结果,然后进行额外的计算。

  

使用a的CompletionService   提供Executor来执行任务。   本课程安排提交   任务完成后,将被放置   使用take访问的队列。该   class足够轻量级   适合短暂使用时   处理任务组。

     

使用示例:假设您有针对某个问题的一组求解器,   每个返回某种类型的值   结果,并希望运行它们   同时处理结果   每个返回非null的   值,在某些方法中使用(结果r)。   你可以写成:

   void solve(Executor e, Collection<Callable<Result>> solvers)
              throws InterruptedException, ExecutionException 
   {
       CompletionService<Result> ecs = new ExecutorCompletionService<Result>(e);
       for (Callable<Result> s : solvers) { ecs.submit(s); }
       int n = solvers.size();
       for (int i = 0; i < n; ++i) 
       {
           Result r = ecs.take().get();
           if (r != null) { use(r); }
       }
   }

您不需要无限制的ExecutorService

您几乎从不希望允许无限制的线程池,因为如果线程数量失控,它们实际上会限制应用程序的性能。

您的域受磁盘或网络I / O或两者的限制,因此一个小的线程池就足够了。您不希望尝试使用每个连接的线程读取数百或数千个传入连接。

部分解决方案,如果您收到的是多个并发上传文件,则需要调查java.nio package并阅读有关非阻塞I / O的内容。

答案 1 :(得分:0)

您是否有理由不想重用线程?在我看来,最简单的方法是使用ExecutorService并让它重用线程。