JAVA线程池总结
侧边栏壁纸
  • 累计撰写 307 篇文章
  • 累计阅读 104.3万

JAVA线程池总结

TOTC
2013-06-29 / 976 阅读 / 正在检测是否收录...

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方法避免内存泄漏。

85

评论

博主关闭了所有页面的评论