是否有可能有一组线程池从大型线程池共享线程而不是创建新线程?

时间:2015-05-14 23:57:23

标签: java multithreading concurrency threadpool executorservice

是否可以拥有一组从大型线程池共享线程而不是创建新线程的线程池?

在我们的RESTful API应用程序中,请求可能涉及多个并行任务。为了提高性能,我们希望在具有固定数量(例如200个)线程的线程池中执行并行任务。但我们也想限制每个请求可以使用的最大线程数。所以我在想是否有可能为每个请求创建一个具有最大池大小的子线程池,它不会自己创建线程但是尝试从全局线程池中获取新线程并将作业放入队列中(如果有)没有可用的线程。

有没有人做过类似的事情?或者还有其他更好的解决方案吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

考虑执行者,而不是线程池。执行程序由两部分组成:作业队列和线程池。您需要的是每个具有作业队列但没有线程的请求的轻量级执行程序。相反,它将作业从其队列传递到主执行程序(它拥有所有线程)。诀窍在于轻量级执行程序计算它已提交给主执行程序的作业数量,并在数量超过限制时停止传递作业。在传递给主执行程序之前,每个作业都包含在Runnable类型的对象中,a)具有对父轻量级执行程序的引用,b)执行包装作业,c)当作业是作业时通知引用的执行程序完成,以便执行程序可以将另一个作业传递给主执行程序(或者只是减少作业计数器,如果队列中没有作业)。

答案 1 :(得分:0)

您可以为每个任务创建一个线程池,例如class Customer{ ... public static Customer find(List<Customer> customers, int id) { return customers.stream().filter(c -> c.customerId == id).findAny().get(); } } //usage List<Customer> customers = readCustomers(); ... Customer.find(customers, 21).setDetails(details); 这将满足您的要求,因为潜在地创建特定任务实例不需要的线程效率低下。