1 线程池的大小设置
int N_CPU = Runtime.getRuntime().availableProcessors();
int U_CPU = 期望的CPU利用率,如0.9;
int W = 等待时间;
int C = 计算时间;
N_THREAD = N_CPU * U_CPU * (1 + W/C)
(计算密集型时一般使用N_CPU+1 )
 
2 java.util.concurrent.ThreadPoolExecutor实现
 
2.1 execute方法
当工作线程数小于corePoolSize时,创建新的工作线程并执行任务;否则将任务加入到workQueue中。
将任务加入到workQueue中时,如workQueue已满则创建新的工作线程并执行任务;如果线程数已达maximumPoolSize则创建新线程失败,任务被reject。
 
2.2 工作线程(Worker)
获取初始任务或调用getTask方法获取任务,执行任务的run方法,当获取不到任务时线程自然终结。
 
2.3 getTask方法
从workQueue中获取任务,如获取不到则等待keepAliveTime的时间。如线程数是否小于等于corePoolSize则无期限等待(可以配置allowCoreThreadTimeOut以改变此行为)。
 
3 队列比较
 
3.1 LinkedBlockingQueue
 
3.2 ArrayBlockingQueue
 
3.3 PriorityBlockingQueue
按优先级排序。
 
3.4 SynchronousQueue
没有存储功能,总有消费者准备好获取任务时适用。
 
4 线程池比较
 
4.1 CachedThreadPool
无界、SynchronousQueue。
 
4.2 FixedThreadPool
corePoolSize==maximumPoolSize、LinkedBlockingQueue。
 
4.3 ScheduledThreadPool
定时执行。
 
4.4 SingleThreadExecutor
nThreads为1的FixedThreadPool

相关文章:

  • 2021-08-07
  • 2022-12-23
  • 2022-12-23
  • 2021-06-07
  • 2021-12-03
  • 2022-12-23
  • 2022-12-23
  • 2021-11-20
猜你喜欢
  • 2021-05-01
  • 2021-07-05
  • 2021-12-03
  • 2021-12-15
  • 2022-12-23
  • 2022-02-03
相关资源
相似解决方案