当前位置: 首页 > 知识库问答 >
问题:

有没有可能使用一组线程池来共享大型线程池中的线程,而不是创建新的线程?

公西星海
2023-03-14

有没有可能使用一组线程池来共享大型线程池中的线程,而不是创建新的线程?

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

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

谢谢!!

共有2个答案

濮阳宜
2023-03-14

您可以为每个任务创建一个线程池,例如Executors.newFixedThreadpool(10)这将满足您的要求,因为可能会创建特定任务实例不需要的线程。

邓德厚
2023-03-14

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

 类似资料:
  • 如果我有一个固定大小的线程池,它什么时候真正调用启动线程?(它会在创建时启动它们吗?还是等到我开始提交任务时再启动?)

  • 如何从线程池中找到60%(或N%)的线程可用性?这背后的逻辑是什么? 父线程使用线程池线程生成多个网址,并等待所有子线程完成。 代码如下所示 父线程 子线程 用于跨线程通信的对象数据 在上述代码中,所需的线程硬编码为: 这种硬编码会导致线程池不足吗?如果线程池中没有可用的线程,会发生什么?如何在托管服务器的线程池中查找可用线程的总数? 谢谢。

  • 使用 时,线程池中最初创建了多少线程,Javadoc 没有指定任何数字,是否有一个保证的数字,我们最初总是会得到 10 个或其他什么。文档如下: newCachedThreadPool public static ExecutorService newCachedThreadPool()创建一个线程池,该线程池根据需要创建新的线程,但会在以前构建的线程可用时重用它们。这些池通常会提高执行许多短期异

  • 主要内容:一、MySql中的线程,二、主要方式,三、源码流程,四、总结一、MySql中的线程 在mysql中,每一个连接上来,就会分配给一个相关的THD数据类。在前面的分析中可以看到,连接器(Connectors)连接到的直接就是连接池,在连接池的线程处理中分为三部分,即一对一(一个连接对应一个线程),多对一(多个连接对应一个线程)和线程池(多对多)。 线程池和线程可以针对不同的具体场景来处理具体的事务,这样既兼顾了效率又提高了适应性,对于新手来说,这就是设计的一个

  • 接收到数据时回调此函数,发生在worker进程中。函数原型: function onReceive(swoole_server $server, int $fd, int $reactor_id, string $data); $server,swoole_server对象 $fd,TCP客户端连接的唯一标识符 $reactor_id,TCP连接所在的Reactor线程ID $data,收到的数

  • 我编写了代码示例: 每100毫秒提交一个新任务(总任务量-20)。每个任务持续时间-0.5秒。因此,可以并行执行5个任务,最佳执行时间为:20*100 500=2.5秒,池应创建5个线程 但我的实验显示为9.6秒。我打开jsvisualvm查看池创建了多少线程,我看到只创建了一个线程: 请更正我的线程池配置不正确的地方。