知识树——线程池

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
posted @ 2015-10-13 14:00  爱上飞飞的面码  阅读(288)  评论(0编辑  收藏  举报