Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
a「;简单的;java中的线程池_Java_Multithreading_Concurrency_Threadpool - Fatal编程技术网

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); }
       }
   }