我正在寻找一个可以容纳我的工作线程的简单对象,我需要它不限制线程的数量,并且不让它们的生存期超过需要。
但我确实需要它具有类似于ExecutorService.shutdown();
的方法
(等待所有 Activity 线程完成,但不接受任何新线程)
所以也许线程池不是我所需要的,所以我希望朝着正确的方向前进。
(因为它们旨在使线程保持 Activity 状态)
进一步澄清意图:
每个线程都是文件的上载,我还有另一个修改文件的过程,但是它等待文件没有任何上载。通过连接每个线程。因此,当它们保持 Activity 状态时,它将锁定该过程。 (每个线程在创建时都会将自己添加到特定文件的列表中,因此我只使用join()上传特定文件的线程)
最佳答案
一种您想做的事情是将Callable
与Future
一起使用,该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的信息。