我正在寻找一个可以容纳我的工作线程的简单对象,我需要它不限制线程的数量,并且不让它们的生存期超过需要。
但我确实需要它具有类似于ExecutorService.shutdown();的方法
(等待所有 Activity 线程完成,但不接受任何新线程)

所以也许线程池不是我所需要的,所以我希望朝着正确的方向前进。
(因为它们旨在使线程保持 Activity 状态)

进一步澄清意图:

每个线程都是文件的上载,我还有另一个修改文件的过程,但是它等待文件没有任何上载。通过连接每个线程。因此,当它们保持 Activity 状态时,它将锁定该过程。 (每个线程在创建时都会将自己添加到特定文件的列表中,因此我只使用join()上传特定文件的线程)

最佳答案

一种您想做的事情是将CallableFuture一起使用,该File返回已完成上传的Future对象。然后将Callable传递到另一个Future.isDone()中,该文件会检查true并旋转,直到返回java.util.concurrent,然后对文件执行所有操作。您的用例不是唯一的,并且非常整洁地适合ExecutorCompletionService package capabilities
java.nio class是一个有趣的类,它在等待结果时完全执行您想要的操作,然后进行其他计算。


   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或两者的限制,因此,一个小的线程池就足够了。您将不想尝试从成百上千的传入连接中读取一个线程,每个连接都有一个线程。

如果您收到的并发上传次数不多,那么解决方案的一部分是研究ojit_code package并阅读有关非阻塞I/O的信息。

10-07 19:01
查看更多