并发编程:线程池使用
Posted 感遇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程:线程池使用相关的知识,希望对你有一定的参考价值。
- 线程池大小计算公式
N_thread = N_cpu * U_cpu * (1+W/C)
U_cpu: target of CPU utilization
W/C: rate of wait time to compute time
- 配置ThreadPoolExecutor
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler) {};
- newFixedThreadPool和newSingleThreadPool:在默认情况下使用无界的LinkedBlockingQueue
- newSingleThreadPool:通过线程封闭来实现线程安全性
- SynchronousQueue:不是真正的队列,是一种在线程之间的进行移交的机制,只有当线程池是无界或者可以拒绝服务时,才有实际价值
- newCachedThreadPool:使用了SynchronousQueue,有更好的排队性能
- 只有当任务相对独立时,为线程池或工作队列设置界限才是合理的,任务有依赖,则可能导致“饥饿”死锁问题
- 队列饱和策略:AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy
- 调用者运行(CallerRunsPolicy):服务器过载时,从线程池->工作队列->应用程序->TCP层,实现一种平缓的性能降低
- 通过Semaphore(信号量)来控制任务的提交速率: new Semaphore(bound)
- ThreadFactory可以自定义
- 扩展ThreadPoolExecutor
- beforeExecute和afterExecute:可以添加日志、计时、监视和统计信息收集
- 线程池操作完成关闭操作时调用terminated
以上是关于并发编程:线程池使用的主要内容,如果未能解决你的问题,请参考以下文章