仅使用ExecutorService中的一部分线程

时间:2014-05-22 13:37:39

标签: java multithreading executorservice

在典型的JAVA应用程序中,可以配置全局ExecutorService来管理全局线程池。假设我配置了100个线程的固定线程池:

ExecutorService threadPool = Executors.newFixedThreadPool(100);

现在假设我有一个1000个文件的列表要上传到服务器,每次上传我创建一个可调用来处理这个文件的上传。

List<Callable> uploadTasks = new ArrayList<Callable>();
// Fill the list with 1000 upload tasks

如何将最大并发上传数量限制为5?

如果我这样做

threadPool.invokeAll(uploadTasks);

我无法控制1000个任务需要多少个线程。可能100个上传将并行运行,但我只想要最多5个。 我想创建某种子执行器,它使用父执行器的一部分线程。 我不想为上传创建一个新的独立的executorService,因为我想全局管理我的线程池。

您是否知道如何做到这一点或是否存在现有实施?理想情况下像

ExecutorService uploadThreadPool = Executors.createSubExecutor(threadPool,5);

非常感谢,

安托

1 个答案:

答案 0 :(得分:1)

  

在典型的JAVA应用程序中,可以配置全局ExecutorService来管理全局线程池。

我没有这样做,但也许我不是非常典型的。 :-)回到你的问题:

由于拥有一名警卫(可能在你的Callable内使用Semaphore只会使你的全局Executor混乱等待彼此的任务,你必须要么< / p>

  • 使用一些外部逻辑,确保在任何时间只有5个作业正在运行,这本身可能是Callable提交给您Executor的作业。这可以通过使用一些逻辑包装下载作业来完成,这些逻辑将在完成一个作业后从队列(包含URL或其他任何内容)中提取下一个作业。然后你提交其中五个&#34;排水下载队列&#34;找到Executor的工作并完成调用。但就像我一样非典型,我只是
  • 使用单独的Executor进行下载。这也使您能够适当地命名线程(在Executor s ThreadFactory中),这可能有助于调试并进行良好的线程转储。