当前位置: 主页 > JAVA语言

java线程池最大线程数-java线程池大小

发布时间:2023-02-13 11:04   浏览次数:次   作者:佚名

关于Java线程池的参数设置。 线程池是Java多线程发展的重要组成部分。 使用起来并不难,但是如何用好它需要了解参数的含义以及如何设置。 干货中的大部分内容都是参考了别人的,也增加了一些知识点和观点。 希望能够对童鞋们进行多线程开发和学习有所启发和帮助。

1.威胁

关于Java线程池的参数

关于Java线程池的参数设置。 线程池是Java多线程发展的重要组成部分。 使用起来并不难,但是如何用好它需要了解参数的含义以及如何设置。 干货中的大部分内容都是参考了别人的,也增加了一些知识点和观点。 希望能够对童鞋们进行多线程开发和学习有所启发和帮助。

一、ThreadPoolExecutor的重要参数

1.corePoolSize:核心线程数

* 核心线程会一直存活,即使没有任务可执行

* 当线程数小于核心线程数时,即使有空闲线程,线程池也会优先新建线程进行处理

* 当设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭

2.queueCapacity:任务队列容量(阻塞队列)

* 当核心线程数达到最大值时,新的任务会在队列中排队等待执行

3. maxPoolSize:最大线程数

* 当线程数>=corePoolSize,任务队列已满时java线程池最大线程数,线程池创建新的线程处理任务

* 当线程数=maxPoolSize,任务队列满时,线程池将拒绝处理任务并抛出异常

4.keepAliveTime:线程空闲时间

* 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数=corePoolSize

* 如果allowCoreThreadTimeout=true,直到线程数=0

5. allowCoreThreadTimeout:允许核心线程超时

6.rejectedExecutionHandler:任务拒绝处理程序

* 两种情况会拒绝处理任务:

- 当线程数达到maxPoolSize时,切入队列已满,新任务将被拒绝

- 当线程池被调用shutdown()时,它会等待线程池中的任务执行完毕后才关闭。如果在调用shutdown()和线程池实际关闭之间提交了任务,新的任务将被拒绝

* 线程池会调用rejectedExecutionHandler来处理这个任务。如果不设置,默认是AbortPolicy,会抛出异常

* ThreadPoolExecutor类内部有几个实现类来处理此类情况:

- AbortPolicy 丢弃任务并抛出运行时异常

- CallerRunsPolicy 执行任务

- 忽略 DiscardPolicy,没有任何反应

- DiscardOldestPolicy 从队列中踢出第一个排队(最后执行)的任务

* 实现RejectedExecutionHandler接口,可以自定义处理器

二、ThreadPoolExecutor执行顺序

线程池根据以下行为执行任务

1、当线程数小于核心线程数时,创建线程。

2.当线程数大于等于核心线程数,任务队列未满时,将任务放入任务队列。

3.当线程数大于等于核心线程数,任务队列满时

- 如果线程数小于最大线程数,创建一个线程

- 如果线程数等于最大线程数,则抛出异常并拒绝任务

3.如何设置参数

1.默认值

* 核心池大小=1

* queueCapacity=Integer.MAX_VALUE

* maxPoolSize=Integer.MAX_VALUE

* keepAliveTime=60s

* allowCoreThreadTimeout=false

* rejectedExecutionHandler=AbortPolicy()

2.如何设置

* 需要根据几个值来决定

- tasks:每秒的任务数,假设500~1000

- taskcost:每个任务花费的时间,假设0.1s

- responsetime:系统允许的最大响应时间,假设为1s

* 做一些计算

- corePoolSize = 每秒需要多少个线程?

* threadcount = tasks/(1/taskcost) =tasks*taskcout = (500~1000)*0.1 = 50~100个线程。 corePoolSize 设置应大于 50

* 根据8020原则,如果每秒80%的任务小于800,则设置corePoolSize为80

- queueCapacity = (coreSizePool/taskcost)*responsetime

* 计算得到queueCapacity = 80/0.1*1 = 80.表示队列中的线程可以等待1s,超过则需要开启新线程执行

* 记住不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize的大小。 当任务激增时,无法开启新的线程执行,响应时间会激增。

- maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost)

* 计算 maxPoolSize = (1000-80)/10 = 92

*(最大任务数-队列容量)/每线程每秒处理能力=最大线程数

- rejectedExecutionHandler:视具体情况而定。 如果任务不重要,可以放弃。 如果任务很重要,应该使用一些缓冲机制来处理它。

- keepAliveTime 和 allowCoreThreadTimeout 通常默认满足

3、以上数值均为理想值。 在实际情况下,应根据机器的性能来确定。 如果在未达到最大线程数时机器cpu负载已经满了,就需要升级硬件(呵呵)和优化代码来降低taskcost。

设置。 线程池是Java多线程发展的重要组成部分。 使用起来并不难,但是如何用好它需要了解参数的含义以及如何设置。 干货中的大部分内容都是参考了别人的,也增加了一些知识点和观点。 希望能够对童鞋们进行多线程开发和学习有所启发和帮助。

一、ThreadPoolExecutor的重要参数

1.corePoolSize:核心线程数

* 核心线程会一直存活,即使没有任务可执行

* 当线程数小于核心线程数时,即使有空闲线程,线程池也会优先新建线程进行处理

* 当设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭

2.queueCapacity:任务队列容量(阻塞队列)

* 当核心线程数达到最大值时,新的任务会在队列中排队等待执行

3. maxPoolSize:最大线程数

* 当线程数>=corePoolSize,任务队列已满时,线程池创建新的线程处理任务

* 当线程数=maxPoolSize,任务队列满时,线程池将拒绝处理任务并抛出异常

4.keepAliveTime:线程空闲时间

* 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数=corePoolSize

* 如果allowCoreThreadTimeout=true,直到线程数=0

5. allowCoreThreadTimeout:允许核心线程超时

6.rejectedExecutionHandler:任务拒绝处理程序

* 两种情况会拒绝处理任务:

- 当线程数达到maxPoolSize时,切入队列已满,新任务将被拒绝

- 当线程池被调用shutdown()时,它会等待线程池中的任务执行完毕后才关闭。如果在调用shutdown()和线程池实际关闭之间提交了任务,新的任务将被拒绝

* 线程池会调用rejectedExecutionHandler来处理这个任务。如果不设置,默认是AbortPolicy,会抛出异常

* ThreadPoolExecutor类内部有几个实现类来处理此类情况:

- AbortPolicy 丢弃任务并抛出运行时异常

- CallerRunsPolicy 执行任务

- 忽略 DiscardPolicy,没有任何反应

- DiscardOldestPolicy 从队列中踢出第一个排队(最后执行)的任务

* 实现RejectedExecutionHandler接口,可以自定义处理器

二、ThreadPoolExecutor执行顺序

线程池根据以下行为执行任务

1、当线程数小于核心线程数时,创建线程。

2.当线程数大于等于核心线程数,任务队列未满时,将任务放入任务队列。

3.当线程数大于等于核心线程数,任务队列满时

- 如果线程数小于最大线程数,创建一个线程

- 如果线程数等于最大线程数,则抛出异常并拒绝任务

3.如何设置参数

1. 默认值

* 核心池大小=1

* queueCapacity=Integer.MAX_VALUE

* maxPoolSize=Integer.MAX_VALUE

* keepAliveTime=60s

* allowCoreThreadTimeout=false

* rejectedExecutionHandler=AbortPolicy()

2.如何设置

* 需要根据几个值来决定

- tasks:每秒的任务数,假设500~1000

- taskcost:每个任务花费的时间,假设0.1s

- responsetime:系统允许的最大响应时间,假设为1s

* 做一些计算

- corePoolSize = 每秒需要多少个线程?

* threadcount = tasks/(1/taskcost) =tasks*taskcout = (500~1000)*0.1 = 50~100个线程。 corePoolSize 设置应大于 50

* 根据8020原则,如果每秒80%的任务小于800,则设置corePoolSize为80

- queueCapacity = (coreSizePool/taskcost)*responsetime

* 计算得到queueCapacity = 80/0.1*1 = 80.表示队列中的线程可以等待1s,超过则需要开启新线程执行

* 记住不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize的大小。 当任务激增时,无法开启新的线程执行,响应时间会激增。

- maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost)

* 计算 maxPoolSize = (1000-80)/10 = 92

*(最大任务数-队列容量)/每线程每秒处理能力=最大线程数

- rejectedExecutionHandler:视具体情况而定。 如果任务不重要,可以放弃。 如果任务很重要,应该使用一些缓冲机制来处理它。

- keepAliveTime 和 allowCoreThreadTimeout 通常默认满足

3、以上数值均为理想值。 在实际情况下,应根据机器的性能来确定。 如果在未达到最大线程数时机器cpu负载已经满了,就需要升级硬件(呵呵)和优化代码来降低taskcost。

dPoolExecutor 重要参数

1.corePoolSize:核心线程数

* 核心线程会一直存活,即使没有任务可执行

* 当线程数小于核心线程数时,即使有空闲线程,线程池也会优先新建线程进行处理

* 当设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭

2.queueCapacity:任务队列容量(阻塞队列)

* 当核心线程数达到最大值时,新的任务会在队列中排队等待执行

3. maxPoolSize:最大线程数

* 当线程数>=corePoolSize,任务队列已满时,线程池创建新的线程处理任务

* 当线程数=maxPoolSize,任务队列满时,线程池将拒绝处理任务并抛出异常

4.keepAliveTime:线程空闲时间

* 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数=corePoolSize

* 如果allowCoreThreadTimeout=true,直到线程数=0

5. allowCoreThreadTimeout:允许核心线程超时

6.rejectedExecutionHandler:任务拒绝处理程序

* 两种情况会拒绝处理任务:

- 当线程数达到maxPoolSize时,切入队列已满,新任务将被拒绝

- 当线程池被调用shutdown()时,它会等待线程池中的任务执行完毕后才关闭。如果在调用shutdown()和线程池实际关闭之间提交了任务,新的任务将被拒绝

* 线程池会调用rejectedExecutionHandler来处理这个任务。如果不设置,默认是AbortPolicy,会抛出异常

* ThreadPoolExecutor类内部有几个实现类来处理此类情况:

- AbortPolicy 丢弃任务并抛出运行时异常

- CallerRunsPolicy 执行任务

- 忽略 DiscardPolicy,没有任何反应

- DiscardOldestPolicy 从队列中踢出第一个排队(最后执行)的任务

* 实现RejectedExecutionHandler接口,可以自定义处理器

二、ThreadPoolExecutor执行顺序

线程池根据以下行为执行任务

1、当线程数小于核心线程数时,创建线程。

2、当线程数大于等于核心线程数,任务队列未满时,将任务放入任务队列。

3.当线程数大于等于核心线程数,任务队列满时

- 如果线程数小于最大线程数,创建一个线程

- 如果线程数等于最大线程数java线程池最大线程数,则抛出异常并拒绝任务

3.如何设置参数

1.默认值

* 核心池大小=1

* queueCapacity=Integer.MAX_VALUE

* maxPoolSize=Integer.MAX_VALUE

* keepAliveTime=60s

* allowCoreThreadTimeout=false

* rejectedExecutionHandler=AbortPolicy()

2.如何设置

* 需要根据几个值来决定

- tasks:每秒的任务数,假设500~1000

- taskcost:每个任务花费的时间,假设0.1s

- responsetime:系统允许的最大响应时间,假设为1s

* 做一些计算

- corePoolSize = 每秒需要多少个线程?

* threadcount = tasks/(1/taskcost) =tasks*taskcout = (500~1000)*0.1 = 50~100个线程。 corePoolSize 设置应大于 50

* 根据8020原则,如果每秒80%的任务小于800,则设置corePoolSize为80

- queueCapacity = (coreSizePool/taskcost)*responsetime

* 计算得到queueCapacity = 80/0.1*1 = 80.表示队列中的线程可以等待1s,超过则需要开启新线程执行

* 记住不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持在corePoolSize的大小。 当任务激增时,无法开启新的线程执行,响应时间会激增。

- maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost)

* 计算 maxPoolSize = (1000-80)/10 = 92

*(最大任务数-队列容量)/每线程每秒处理能力=最大线程数

- rejectedExecutionHandler:视具体情况而定。 如果任务不重要,可以放弃。 如果任务很重要,应该使用一些缓冲机制来处理它。

- keepAliveTime 和 allowCoreThreadTimeout 通常默认满足

3、以上数值均为理想值。 在实际情况下,应根据机器的性能来确定。 如果在未达到最大线程数时机器cpu负载已经满了,就需要升级硬件(呵呵)和优化代码来降低taskcost。