JAVA线程池ThreadPoolExecutor简介

JAVA线程池ThreadPoolExecutor简介,第1张

JAVA线程池ThreadPoolExecutor简介

ThreadPoolExecutor简介
  • ThreadPoolExecutor线程池的7个参数
  • ThreadPoolExecutor执行流程
  • ThreadPoolExecutor注意事项

ThreadPoolExecutor线程池的7个参数


1.corePoolSize核心线程数,int类型,不能小于0。这个参数代表线程池中存活最小的线程数。

2.maximumPoolSize线程池最大线程数量,int类型,得大于0,而且不小于corePoolSize。这个线程池中最多允许有maximumPoolSize个线程。

3.keepAliveTime空闲线程存活时间,long类型,不能小于0。

4.unit空闲线程存活时间单位。具体可以参考TimeUnit里面得枚举类型(NANOSECONDS,MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS)

5.workQueue任务队列。这里面是有4中类型:
① SynchronousQueue:不会缓存任务得阻塞队列。一个任务过来直接交给线程去执行,如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略。通常需要无限的MaximumPoolSize来实现避免拒绝新提交的任务。
②linkedBlockingQuene:基于链表的无界阻塞队列(其最大容量为Interger.MAX),按照FIFO排序。如果不设定值,超过核心线程数量得任务会一直存入队列,maximumPoolSize不会发挥作用。
③ArrayBlockingQueue:基于数组的有界阻塞队列,按FIFO排序。使用大型队列和小型池可以最大限度地减少CPU使用率、 *** 作系统资源和上下文切换开销,但可以导致人为的低吞吐量。如果任务经常阻塞(对于例如,如果它们是I/O绑定的),则系统可能能够调度所需的线程数超过了您所允许的线程数。使用小队通常需要更大的池大小,这使CPU更繁忙,但可能会遇到不可接受的调度开销,这也降低吞吐量。
④PriorityBlockingQueue:具有优先级的无界阻塞队列,优先级通过参数Comparator实现。

以上5个参数是必填得

6.ThreadFactory:线程工厂,如果不设置,则创建一个默认得工厂,Executors.defaultThreadFactory()。

7.handler :拒绝策略。也是有4种:
① AbortPolicy:中止策略,默认得拒绝策略。在任务不能再提交的时候,抛出异常。
②DiscardPolicy:丢弃策略,丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。
③DiscardOldestPolicy:弃老策略,丢弃最旧的未处理任务,然后重新提交被拒绝的任务;
④CallerRunsPolicy:调用者运行策略,由调用线程处理该任务。

ThreadPoolExecutor执行流程

首先我新建一个线程池演示:

new ThreadPoolExecutor(10, 20, 30L, TimeUnit.SECONDS, new linkedBlockingQueue<>(100))


多个线程过来,首先创建核心线程去执行,如果任务大于核心线程数,那么就把多余得任务放在队列中等待。如果队列放不下剩余得任务,就会根据maximumPoolSize去创建新的线程执行任务。如果已经创建了最大得线程数了,队列也满了,那么将执行默认得拒绝策略。

ThreadPoolExecutor注意事项

1.使用任务队列得时候注意设置队列得长度。(不然你懂得)
2.设置合理得线程数。(可以参考网上得)
3.使用线程池得时候注意最好使用单例模式。合理使用线程池,避免资源浪费。
4.JUC带得4种线程池都是创建ThreadPoolExecutor,只是设置得参数不一样。

参考: https://blog.csdn.net/weixin_48502062/article/details/106682658
https://blog.csdn.net/ye17186/article/details/89467919

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4021277.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-22
下一篇 2022-10-22

发表评论

登录后才能评论

评论列表(0条)

保存