还使用调用线程的线程池?

时间:2018-01-19 00:02:42

标签: java multithreading architecture threadpool

是否有任何线程池实现也允许使用调用线程执行?

一些背景 - 我有一项服务需要调用许多依赖服务(并对其结果进行一些工作)。我的服务是大规模并行的,并且最多可以使用1000个线程来处理并发请求(实际上,我不是在开玩笑)。

并行处理的一种常见模式当然是用于从主线程中分配工作的后台线程的共享池。它还有一个基本的耗尽问题,如果1000个服务线程中的每一个都提交一个长期运行的请求,那么它很容易完全耗尽所有池的容量。

另一个经典解决方案是为每个服务线程使用专用线程池。它不是很吸引人,因为我无法使这些私人泳池足够大。

所以我的想法是使用一种特殊类型的线程池执行器来运行调用线程中的任务,如果它具有可用容量,则机会性地使用后台线程池来运行任务。这样我就可以保证调用线程在任何情况下都会取得一些进展,即使后台池已经用完了。

有人知道这样的线程池实现吗?

2 个答案:

答案 0 :(得分:0)

虽然问题不是很清楚,但听起来线程主要阻止等待来自其他服务的响应。这不是对这些线程的高效使用。大量线程经常导致调度程序运行inefficiently

或者,您可以考虑将异步套接字与完成处理程序一起使用。这可以避免阻塞i / o,并在代码中调用处理程序,您可以在其中响应通道中发生的i / o事件。

这最终意味着您可以大量减少应用程序中的线程数, 可以提高性能。

答案 1 :(得分:0)

另一种方法是在调用线程和线程池之间放置一个任务队列。每个请求都放在队列中,工作人员依次处理队列中的任务。任务完成后,通知将发送回调用线程。

使用此机制,您始终可以确保最终处理任务。