包括:
一. 线程池概念
二. 线程池几个重要的类
三. 线程池使用Demo(待实现)
一. 线程池概念
并发数量太多的时候,就需要频繁的创建线程和销毁线程,那么创建和销毁这个过程是比较耗费时间的。所以说,可以使用线程池的方法避免这个问题。
线程池相关的东西主要在 java.util.concurrent 包中。
二. 线程池几个重要的类
- ExecutorService:真正的线程池接口。
- ThreadPoolExecutor:ExecutorService 的默认实现。
- ScheduledExecutorService:能和 Timer/TimerTask类似,解决那些需要任务重复执行的问题。
- ScheduledThreadPoolExecutor:继承了 ThreadPoolExecutor 和实现了 ScheduledExecutorService 接口,能实现周期性的任务调度。
整个类结构如下图:
其中,核心类 ThreadPoolExecutor 分析如下:
1. 构造方法:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), handler);
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
参数含义:
- corePoolSize:创建线程池之后,默认没有任何线程,而是有任务来才创建线程。当线程池中的线程数目达到corePoolSize的时候,就会把到达的任务放入缓存队列中。
- maximunPoolSize:线程池最大的线程数,它表示线程池中最多可以创建多少个线程。
- keepAliveTime:线程没有任务执行的时候最多会保持多长的时间会中止,默认情况下,只有当线程数大于corePoolSize 的时候,如果一个线程空闲的时候达到 keepAliveTime,则会中止,直到线程池中的线程数大于corePoolSize。
- unit:参数 keepAliveTime 的单位,有7种取值。天,小时,分钟,秒,毫秒,微妙,纳秒。
- workQueue:一个阻塞队列,用来存储等待执行的任务,一般会有如下几种选择:
- ArrayBlockingQueue。
- LinkedBlockingQueue。
- SynchronusQueue。
- threadFactory:线程工厂,主要用来创建线程用的。
- hanlder:表示当拒绝任务时使用的策略,一般有如下几种取值:
- ThreadPoolExecutor.AbortPolicy:丢弃任务并且抛出RejectExecutionException异常。
- ThreadPoolExecutor.DiscardPolicy:丢弃任务但是不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃最前面的任务,然后重新执行任务。
- ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。
2. 核心方法
executor()
submit()
shutdown()
shutdownNow()
- executor():向线程池提交一个任务,并且交由线程池去执行。
- submit()方法:也是向线程池提交一个任务,但是和submit()方法不一样的是,可以返回结果。
- shutdown(),shutdownNow() :用来关闭线程池。
注意:在 java doc 中,并不提倡我们直接使用ThreadPoolExecutor。而是使用Executors 类中提供的几个静态方法:
- Executors.newCachedThreadPool():创建一个缓冲池,池的容量大小为 Integer.MAX_VALUE。
- Executors.newSingleThreadPool():创建容量为1 的缓冲池。
- Executors.newFixedThreadPool(int):创建一个固定大小的缓冲池。
三. 线程池使用Demo(待实现)
参考:
- Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html