我正在寻找一个能够保存我的工作线程的简单对象,我需要它不限制线程的数量,而不是让它们保持活动的时间超过需要的时间。
但我确实需要一个类似于ExecutorService.shutdown();
的方法
(等待所有活动线程完成但不接受任何新线程)
所以也许线程池不是我需要的,所以我希望能朝着正确的方向努力。 (因为它们意味着保持线程活着)
进一步澄清意图:
每个线程都是一个文件的上传,我有另一个修改文件的进程,但它等待文件没有任何上传。通过加入每个线程。因此,当它们保持活着时,它会锁定该过程。 (每个线程在创建时将自己添加到特定文件的列表中,因此我只加入()上传特定文件的线程)
答案 0 :(得分:6)
要做的事情的一种方法是使用Callable
和Future
来返回已完成上传的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并让它重用线程。