首页 > 代码库 > 并发编程:线程池使用

并发编程:线程池使用

 

  • 线程池大小计算公式

  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) {};   
  1. newFixedThreadPool和newSingleThreadPool:在默认情况下使用无界的LinkedBlockingQueue
  2. newSingleThreadPool:通过线程封闭来实现线程安全性
  3. SynchronousQueue:不是真正的队列,是一种在线程之间的进行移交的机制,只有当线程池是无界或者可以拒绝服务时,才有实际价值
  4. newCachedThreadPool:使用了SynchronousQueue,有更好的排队性能
  5. 只有当任务相对独立时,为线程池或工作队列设置界限才是合理的,任务有依赖,则可能导致“饥饿”死锁问题
  6. 队列饱和策略:AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy
  7. 调用者运行(CallerRunsPolicy):服务器过载时,从线程池->工作队列->应用程序->TCP层,实现一种平缓的性能降低
  8. 通过Semaphore(信号量)来控制任务的提交速率: new Semaphore(bound)
  9. ThreadFactory可以自定义
  • 扩展ThreadPoolExecutor
  1. beforeExecute和afterExecute:可以添加日志、计时、监视和统计信息收集
  2. 线程池操作完成关闭操作时调用terminated

 

并发编程:线程池使用