线程池常用参数
参数名 | 类型 | 含义 |
---|---|---|
corePoolsize | int | 核心线程数 |
maxPoolsize | int | 最大线程数 |
keepAliveTime | long | 存活时间 |
workQueue | BlockingQueue | 任务存储队列 |
theadFactory | ThreadFactory | 通过该生成新的线程 |
Handler | 拒绝策略 |
添加线程规则
- 如果线程数小于corePoolSize,即使其他工作线程处于空闲状
态,也会创建一个新线程来运行新任务。 - 如果线程数等于(或大于)corePoolSize但少于
maximumPoolSize,则将任务放入队列。 - 如果队列已满,并且线程数小于maxPoolSize,则创建一个新
线程来运行任务。 - 如果队列已满,并且线程数大于或等于maxPoolSize,则拒绝
该任务。
常见工作队列
1.直接交接:SynchronousQueue
2.无界队列:LinkBlockingQueue
3.有界队列;ArrayBlockingQueue
常见线程池:
1.FixedThreadPool:
创建一个固定数量的线程池
例如
ExecutorService executorService = Executors.newFixedThreadPool(5);
其具体实现为:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
2.newCachedThreadpool
可缓存线程池
构造方法为:
ExecutorService executorService = Executors.newCachedThreadPool();
内部实现为:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
3.ScheduledThreadPool
周期性线程池
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
4.SingleThreadExecutor
单一线程池
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
停止线程池的方法:
1.shutdown
2.shutdownnow
拒绝策略
1.AbortPolicy
2.DiscardPolicy
3.DiscardOldPolicy
4.CallerRunsPolicy
前三种会有所损失