在典型的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);
非常感谢,
安托
答案 0 :(得分:1)
在典型的JAVA应用程序中,可以配置全局ExecutorService来管理全局线程池。
我没有这样做,但也许我不是非常典型的。 :-)回到你的问题:
由于拥有一名警卫(可能在你的Callable
内使用Semaphore
只会使你的全局Executor
混乱等待彼此的任务,你必须要么< / p>
Callable
提交给您Executor
的作业。这可以通过使用一些逻辑包装下载作业来完成,这些逻辑将在完成一个作业后从队列(包含URL或其他任何内容)中提取下一个作业。然后你提交其中五个&#34;排水下载队列&#34;找到Executor
的工作并完成调用。但就像我一样非典型,我只是Executor
进行下载。这也使您能够适当地命名线程(在Executor
s ThreadFactory
中),这可能有助于调试并进行良好的线程转储。