java线程池是一种线程复用机制,主要功能是将用户需要执行的任务(Runnable对象或者子类)放到线程池执行,同时可以控制程序占用的内存和CPU资源(相当于设定了资源使用边界,对于在有限资源的设备上是非常鼓励的)。
java线程池的主要使用类是ThreadPoolExecutor,创建这个线程池类有几种常用参数:
corePoolSize – 核心线程数
maximumPoolSize – 最大线程数,最大线程数和核心线程数的差值即为非核心线程数
keepAliveTime – 超过核心线程数的任务最大等待时间
unit – 等待时间的计时单位,毫秒/秒/微秒等
workQueue — 等待队列,可以设置队列类型和大小
RejectedExecutionHandler — 拒绝策略,默认是抛出异常,可以设置为:主线程执行、队首任务丢弃、队尾任务丢弃等
线程池的创建过程:
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(
2,
3,
0L,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Thread>(2){
@Override
public boolean offer(Thread thread) {
System.out.println(System.nanoTime() + " : " + TAG + " : put thread into queue, name : " + thread.getName());
return super.offer(thread);
}
}
);
*其中等待队列使用了ArrayBlockingQueue,指定队列最大长度为2,
-即核心线程数执行满了之后,加入到该队列中,
-如果队列已满,再加入的任务就直接使用非核心线程执行,
-如果加入的任务超过队列最大线程数,则执行拒绝策略。
1,情况1
*加入了4个线程,线程1,2执行执行,线程3,4等待执行
2,情况2
*加入了5个线程,线程1,2直接执行,线程3,4等待执行,线程5超过等待队列非核心线程执行
3,情况3
*线程1,2直接执行,线程3,4等待执行,线程5非核心线程执行,线程6执行拒绝策略(默认)抛出异常