是否可以有一组线程池共享来自一个大线程池的线程而不是创建新线程?
Is it possible to have a set of thread pools that share threads from a large thread pool instead of creating new thread?
是否可以有一组线程池共享来自一个大线程池的线程而不是创建新线程?
在我们的RESTfulAPI应用程序中,一个请求可能涉及多个并行任务。为了提高性能,我们希望在具有固定数量(比如 200)线程的线程池中执行并行任务。但是我们也想限制每个请求可以使用的最大线程数。所以我在想是否有可能为每个请求创建一个具有最大池大小的子线程池,它不会自己创建线程但会尝试从全局线程池中获取一个新线程并将作业放入队列(如果有)没有可用的线程。
有没有人做过类似的事情?或者还有其他更好的解决方案吗?
谢谢!!
考虑执行器而不是线程池。执行器由两部分组成:作业队列和线程池。您需要的是为每个具有作业队列但没有线程的请求的轻量级执行程序。相反,它将作业从其队列传递给主执行器(拥有所有线程)。诀窍是轻量级执行器计算它已经向主执行器提交了多少作业,并在数量超过限制时停止传递作业。每个作业在传递给主执行程序之前,都被包装在一个 Runnable 类型的对象中,该对象 a) 具有对父轻量级执行程序的引用,b) 执行包装的作业,以及 c) 在作业运行时通知引用的执行程序完成以便执行程序可以将另一个作业传递给主执行程序(或者如果队列中没有作业,则只需减少作业计数器)。
您可以为每个任务创建一个线程池,例如Executors.newFixedThreadPool(10)
这将满足您的要求,但可能会创建特定任务实例不需要的线程,效率低下。
是否可以有一组线程池共享来自一个大线程池的线程而不是创建新线程?
在我们的RESTfulAPI应用程序中,一个请求可能涉及多个并行任务。为了提高性能,我们希望在具有固定数量(比如 200)线程的线程池中执行并行任务。但是我们也想限制每个请求可以使用的最大线程数。所以我在想是否有可能为每个请求创建一个具有最大池大小的子线程池,它不会自己创建线程但会尝试从全局线程池中获取一个新线程并将作业放入队列(如果有)没有可用的线程。
有没有人做过类似的事情?或者还有其他更好的解决方案吗?
谢谢!!
考虑执行器而不是线程池。执行器由两部分组成:作业队列和线程池。您需要的是为每个具有作业队列但没有线程的请求的轻量级执行程序。相反,它将作业从其队列传递给主执行器(拥有所有线程)。诀窍是轻量级执行器计算它已经向主执行器提交了多少作业,并在数量超过限制时停止传递作业。每个作业在传递给主执行程序之前,都被包装在一个 Runnable 类型的对象中,该对象 a) 具有对父轻量级执行程序的引用,b) 执行包装的作业,以及 c) 在作业运行时通知引用的执行程序完成以便执行程序可以将另一个作业传递给主执行程序(或者如果队列中没有作业,则只需减少作业计数器)。
您可以为每个任务创建一个线程池,例如Executors.newFixedThreadPool(10)
这将满足您的要求,但可能会创建特定任务实例不需要的线程,效率低下。