a「;简单的;java中的线程池
我正在寻找一个简单的对象,它将容纳我的工作线程,我需要它不限制线程的数量,也不需要让它们比需要的时间长。 但我确实需要它有一个类似于a「;简单的;java中的线程池,java,multithreading,concurrency,threadpool,Java,Multithreading,Concurrency,Threadpool,我正在寻找一个简单的对象,它将容纳我的工作线程,我需要它不限制线程的数量,也不需要让它们比需要的时间长。 但我确实需要它有一个类似于ExecutorService.shutdown()的方法 (等待所有活动线程完成,但不接受任何新线程) 因此,也许线程池不是我需要的,所以我希望朝着正确的方向推进。 (因为它们旨在保持线程的活动性) 进一步澄清意图: 每个线程都是一个文件的上传,我有另一个进程修改文件,但它会等待文件没有任何上传。通过连接每个螺纹。因此,当它们保持活动状态时,它会锁定该过程。(每个
ExecutorService.shutdown()的方法代码>
(等待所有活动线程完成,但不接受任何新线程)
因此,也许线程池不是我需要的,所以我希望朝着正确的方向推进。
(因为它们旨在保持线程的活动性)
进一步澄清意图:
每个线程都是一个文件的上传,我有另一个进程修改文件,但它会等待文件没有任何上传。通过连接每个螺纹。因此,当它们保持活动状态时,它会锁定该过程。(每个线程在创建时都会将自己添加到特定文件的列表中,因此我只加入上载特定文件的()线程)您不想重用线程的原因是什么?在我看来,最简单的方法就是使用ExecutorService,让它重用线程。一种方法是使用可调用的和未来的,该返回已完成上载的文件
对象。然后将Future
传递到另一个Callable
中,该Callable检查Future.isDone()
并旋转直到返回true
,然后对文件执行任何需要执行的操作。您的用例不是唯一的,非常适合java.util.concurrent
一个有趣的类是ExecutorCompletionService
,它完全按照您的要求等待结果,然后继续进行额外的计算
使用
提供执行器以执行任务。
这个类安排提交的
任务完成后,放在
使用take访问的队列。这个
类足够轻,可以
适合在以下情况下临时使用:
处理任务组
用法示例:假设您有一组特定问题的解决方案,
每个都返回某种类型的值
结果,并希望运行它们
同时,处理结果
返回非空值的每个
值,在某些方法中使用(结果r)。
你可以这样写:
void solve(执行器e、集合解算器)
抛出InterruptedException、ExecutionException
{
CompletionService ecs=新的ExecutionCompletionService(e);
对于(可调用的s:solver){ecs.submit(s);}
int n=solvers.size();
对于(int i=0;i
您不想要一个无限的ExecutorService
您几乎不希望允许无限线程池,因为如果线程数量失控,它们实际上会限制应用程序的性能
您的域受到磁盘或网络I/O或两者的限制,所以一个小的线程池就足够了。您不会希望尝试读取成百上千个传入连接,每个连接都有一个线程
解决方案的一部分是,如果您收到的并发上传数量超过一小部分,那么您需要调查java.nio
,并了解非阻塞I/O。每个线程都是一个文件的上传,我有另一个进程修改文件,但它会等待文件没有任何上传。通过连接每个螺纹。因此,当它们保持活动状态时,它会锁定该过程。(每个线程在创建时都会将自己添加到特定文件的列表中,因此我只加入上载特定文件的()线程)您混淆了两个概念:线程和任务。任务是“上载此文件”,线程是完成任务的可重用资源。任务(上传时可运行)可以在不调用线程上的join()的情况下向“其他进程”发出信号。“其他进程”究竟是如何接收这些信号的?
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); }
}
}