Executors类提供了4种不同的线程池
1.newCachedThreadPool ——SynchronousQueue
2.newFixedThreadPool ——LinkedBlockingQueue
3.newScheduledThreadPool
4.newSingleThreadExecutor ——LinkedBlockingQueue
参数
corePoolSize 线程池核心线程大小。
maxPoolSize 线程池最大线程数量,如果工作队列满了,才会创建一个新线程。
keepAliveTime 空闲线程存活时间。
unit 空间线程存活时间单位,
keepAliveTime的计量单位。
workQueue 工作队列
ArrayBlockingQueue :生产和消费用的是同一个锁;必须指定大小(有界)。
LinkedBlockingQueue :锁是分离的;转换为Node<E>进行插入或移除、会生成额外的Node对象、对GC有影响都可以;不指定大小时(无界),生产速度大于消费速度时候,有可能会内存溢出。
PriorityBlockingQueue
SynchronousQuene ,newCachedThreadPool,操作必须是放和取交替完成。
threadFactory,设定线程名、是否为daemon线程,守护线程。
allowCoreThreadTimeout
RejectedExecutionHandler 拒绝策略
AbortPolicy ,丢弃任务并抛出异常,默认。
DiscardPolicy ,丢弃任务。
DiscardOldestPolicy ,丢弃队列最前面的任务,然后重新提交被拒绝的任务。不和优先级队列同时使用。
CallerRunsPolicy ,由调用线程处理该任务 导致程序阻塞,性能效率上必然的损失较大。
默认配置
corePoolSize = 1
queueCapacity = Integer.MAX_VALUE
maxPoolSize = Integer.MAX_VALUE
keepAliveTime = 60秒
allowCoreThreadTimeout = false
rejectedExecutionHandler = AbortPolicy()
corePoolSize、maxPoolSize根据机器资源配置相同的值
根据峰值持续的时间设置
allowCoreThreadTimeout = true、
keepAliveTime来动态控制存活线程的数量。
自定义任务队列,可以根据当前并发量,通过简单的管理页面随时动态调整队列的长度(保证线程安全的前提下)。
ThreadLocal
每个线程都会有这个变量的一个副本。
Thread类中有两个变量,是ThreadLocal.ThreadLocalMap ThreadLocalMap的key是ThreadLocal的弱引用,在没有其他地方对ThreadLoca依赖时,ThreadLocalMap中的ThreadLocal对象就会被回收掉,但是对应的value不会被回收,Map中就可能存在key为null但是value不为null的项,所以使用完毕及时调用remove方法避免内存泄漏。
评论