博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程池参数详解
阅读量:4210 次
发布时间:2019-05-26

本文共 2219 字,大约阅读时间需要 7 分钟。

我们知道JUC提供了丰富的并发工具类,其中类似于组的结构叫做线程池。就是说我们可以将我们需要运行的线程加入到这个组内,然后通过启动线程池来执行加入到线程池的所有任务。既然是容器,那么必然会有很多参数为容器运行的界定边界。那么这些参数又有什么意义?通过理解这些参数我们也可以从侧面了解线程池的逻辑形式和运行机理。

public ThreadPoolExecutor(int corePoolSize,                              int maximumPoolSize,                              long keepAliveTime,                              TimeUnit unit,                              BlockingQueue
workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.acc = System.getSecurityManager() == null ? null : AccessController.getContext(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = threadFactory; this.handler = handler; }

上述代码是用来初始化一个ThreadPoolExecutor,也就是线程池执行器。因为线程池并不单单是容器,还是还有很多操作线程的方法。

其主要的参数有corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler

其中

corePoolSize很好理解,就是核心线程数。也就是在线程池中肯定存在的线程数。

maximumPoolSize是最大线程数。就是随着加入线程池的线程越来越多线程池创建的线程会越来越多,那么索要创建的线程数目的上限是是多少。这个数字就是用来描述这个的。

现在最小和最大都有的还缺什么?

我们看到keepAliveTime,keepAliveTime是用来描述线程销毁的闲置时间量,如果任务加入到线程池线程池的核心线程在处理其他任务。所以线程池创建了新的线程。但是新线程处理完毕该任务之后等待了keepAliveTime时间没有新任务。那么该线程就会销毁。allowCoreThreadTimeout是用来描述核心线程时候可以在keepAliveTime时间的空闲中退出。其中传入的参数unit也就是一个处理keepAliveTime的工具罢了。

workQueue从字面上理解应该是工作队列。而且这个队列是BlockingQueue,我们之前学过BlockingQueue的类型。LinkedBlockingDeque、ArrayBlockingQueue、PriorityBlockingQueue、SynchronousQueue。这里要求我们传入的是Runable类型,也就是传入的是任务。回顾一下我们上学时候学的Thread类,那么Thread就是线程了,而runable则是执行的任务了。那么WorkQueue应该就是我们提交的任务的存储容器。如果核心线程再处理任务。那么就会创建新线程处理提交的任务。如果线程的数量达到了maximumPoolSize之后就不再创建线程,也就是再来的任务就会加入到这个队列中。等待线程执行。如果超过了这个容量估计会会拒绝任务的提交。

threadFactory是线程工厂,主要用来创建线程。

handler是拒绝策略,也就是上边说的任务队列满了之后线程池的响应策略。那么这个策略应该是可以自定义或者提供了比较常用的方式。

转载地址:http://sqkmi.baihongyu.com/

你可能感兴趣的文章
关于select()方法最大轮询数限制的更正
查看>>
话说Connect reset异常
查看>>
Netty笔记:FrameDecoder
查看>>
spring使用注解暴露remoting服务
查看>>
Nio框架需要注意的两个问题(2)
查看>>
Netty笔记:ReplayingDecoder中buffer使用的一点小陷阱
查看>>
Java并发编程JUC源码学习之ThreadPoolExecutor
查看>>
基于Netty实现CometStreaming方式的聊天室
查看>>
基于Netty打造HttpClient实现股票实时推送
查看>>
用CountDownLatch和AtomicReference解决cache失效大并发透传DB的思路
查看>>
wait-notify的另一种情况
查看>>
Netty的Nio写优化
查看>>
2013技术博客汇总贴
查看>>
Redis Object的Idle Time
查看>>
写给分布式神器Fourinone
查看>>
讨论一下淘宝的Fourinone
查看>>
写给高性能数据库引擎coolhash
查看>>
写给《数据库引擎 CoolHash 性能测试报告》
查看>>
java中的mmap实现
查看>>
Redis的Aof被阻塞原因调查
查看>>