属性
1 | int corePoolSize;//核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会受存keepAliveTime限制。除非将allowCoreThreadTimeOut设置为true |
方法
- getCorePoolSize():返回核心线程数量,即corePoolSize
- getPoolSize():返回当前线程池中线程数,刚创建线程池时线程数为0,直到有任务提交过来才创建线程
- getQueue().size():获取当前任务队列的实际容量
任务队列
- SynchronousQueue:直接提交的队列
该任务队列没有容量,新任务总是提交给线程执行,如果活跃线程达到最大值,新任务提交会执行拒绝策略,这种队列会导致线程数过多或太容易触发拒绝策略一般不建议使用
- ArrayBlockingQueue:有界任务队列
构造函数必须传容量表示任务队列的最大值
新任务提交,若线程池实际线程数小于核心线程数的话会创建线程,等于核心线程数的话会把任务放入队列中,队列满的话创建新的线程,达到最大线程数并且队列满的话执行拒绝策略
- LinkedBlockingQueue:无界任务队列
新任务提交,若线程池实际线程数小于核心线程数的话会创建线程,等于核心线程数的话会把任务放入队列中,由于是无界(其实也是有最大值的),队列基本不会满,新任务会一直放入队列中而不会创建新的线程,使用不当会发生内存溢出
所以一般会设置个容量,队列满时创建新线程,达到最大线程数并且队列满的话执行拒绝策略
拒绝策略
AbortPolicy:默认拒绝策略,新任务会被拒绝并抛出异常
1
2
3
4
5public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}DiscardPolicy:直接丢弃被拒绝的任务
1
2public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}DiscardOldestPolicy:如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)
1
2
3
4
5
6public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}CallerRunsPolicy:交由调用者线程来执行任务
1
2
3
4
5public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}