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

ThreadPoolExecutor中的核心池大小与最大池大小

岳奇逸
2023-03-14

当我们用ThreadPoolExecitor来谈论核心池大小和最大池大小之间的区别到底是什么?
可以借助示例来解释吗?

共有3个答案

萧无尘
2023-03-14

从文档:

在方法execute(java.lang.Runnable)中提交新任务时,如果运行的线程少于corePoolSize,则会创建一个新线程来处理该请求,即使其他工作线程处于空闲状态。如果运行的线程超过corePoolSize,但小于maximumPoolSize,则仅当队列已满时,才会创建新线程。

此外:

通过将corePoolSize和maximumPoolSize设置为相同,可以创建一个固定大小的线程池。通过将maximumPoolSize设置为本质上无界的值,如整数。MAX\u值,则允许池容纳任意数量的并发任务。最典型的情况是,核心池和最大池大小仅在构建时设置,但也可以使用setCorePoolSize(int)和setMaximumPoolSize(int)动态更改。

牛景同
2023-03-14

如果正在运行线程

来自doc:(如果运行的线程超过corePoolSize,但小于maximumPoolSize,则仅当队列已满时,才会创建新线程。)

现在,举个简单的例子,

ThreadPoolExecutor executorPool = new ThreadPoolExecutor(5, 10, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50));

在这里,5是corePoolSize-意味着Jvm将为前5个任务的新任务创建新线程。其他任务将被添加到队列中,直到队列已满(50个任务)。

10是maxPoolsize-JVM最多可以创建10个线程。意味着如果已经有5个任务/线程正在运行并且队列已满,有50个挂起的任务,如果还有一个新请求/任务到达队列,那么JVM将创建最多10个新线程(总线程=之前的5个新5个);

new ArrayBlockingQueue(50)=是一个总队列大小-它可以在其中排队50个任务。

一旦所有10个线程都在运行,如果新任务到达,那么新任务将被拒绝。

SUN内部创建线程的规则:

>

  • 如果线程数小于corePoolsize,请创建一个新线程来运行新任务。

    如果线程数等于(或大于)corePoolSize,则将任务放入队列。

    如果队列已满,且线程数小于maxPoolSize,请创建一个新线程以在其中运行任务。

    如果队列已满,且线程数大于或等于maxPoolSize,请拒绝该任务。

    希望,这是有帮助的。。如果我错了,请纠正我。。。

  • 华心思
    2023-03-14

    来自这篇博文:

    以这个例子为例。起始线程池大小为1,核心池大小为5,最大池大小为10,队列为100。

    当请求进来时,最多将创建5个线程,然后将任务添加到队列中,直到达到100个。当队列已满时,将创建最多maxPoolsize的新线程。一旦所有线程都在使用并且队列已满,任务将被拒绝。随着队列的减少,活动线程的数量也会减少。

     类似资料:
    • 当容器加载时,spring boot HikariCP提供的默认连接池大小是多少? 当然,我使用下面的属性来设置最大cp大小,但是我想知道如果我们在application.properties文件中没有给出任何数字,默认的cp大小是多少。 如果我给出application.properties最大池大小为100,而我只使用20,这会影响我的应用程序性能吗?

    • 自定义线程池的建议大小是number_of_cores+1(请参见此处和此处)。假设有一个Spring应用程序在一个系统上有两个核心,配置如下所示 在这种情况下,将有一个ExecutorService在几个请求之间共享。因此,如果有10个请求到达服务器,那么在ExecutorService中只能同时执行其中的3个请求。这可能会产生瓶颈,并且随着请求数量的增加,结果会变得更糟(请记住:默认情况下,t

    • 在我的ASP. net网站,我有一个连接到SQL服务器快速数据库。有时候我确实会犯很多错误,比如 系统。异常:超时已过期。从池中获取连接之前的超时时间。这可能是因为所有池连接都在使用中,并且达到了最大池大小。 搜索错误后,我发现可能是由于SQL Server连接未关闭。但是我已经正确地使用了SQL Server连接,并且正确地处理了它。我已使用using语句处理连接。在我的应用程序中,我在一天中的

    • 我使用的是SpringBoot2.0。3释放。我想增加HikariCP的最大池大小,默认情况下为10。 我试着在带有 spring.datasource.hikari.maximum-池-大小=200 但是它不起作用,因为在日志中它仍然显示最大池大小为10。 我想改变的原因是,我不知怎么地达到了登台的极限,我不知道是什么原因造成的。

    • 嘿,我正在使用Glassfish开源v4,我遇到了一个奇怪的问题。 我在管理控制台中定义了到Oracle 11g的JDBC连接池,并设置了: 初始和最小池大小:500 最大游泳池大小:1000 池大小调整数量::750 我已经为这个连接池创建了一个特定的用户。然而,有时当我检查数据库中打开的连接时,我发现有1000多个连接(我看到的最大连接数是1440个) 当发生这种情况时,任何查询尝试都会失败,

    • null 其他地方配置了工人数,当前;是而是。我在一台拥有两个核心和8GB内存的Macbook Pro 10上测试这一点;生产服务器要大得多。我正在与之交谈的数据库背后是一个速度极慢的VPN。我使用Oracle的Javase1.8JVM运行所有这些。本地服务器是Tomcat7。Oracle JDBC驱动程序是10.2版(我也许能够说服那些使用较新版本的能力)。所有方法要么返回要么返回并且应该是非阻