线程池中的线程初始化
默认情况下,线程池是没有线程的,需要提交任务之后才创建线程。
在实际中如果需要创建之后立即创建线程,可以通过以下连个方法:
preStartCoreThread():初始化一个核心线程
preStartAllCoreThreads():初始化所有核心线程
public boolean preStartCoreThread(){
return addIfUnderCorePoolSize(null);
}
public int preStartAllCoreThreads(){
int n=0;
while(addIfUnderCorePoolSize(null)){
++n;
}
return n;
}
注意上面传进去的参数是null,根据分析可知如果传进去的参数为null,则最后执行线程会阻塞在getTask方法中的。
r=workQueue.take();及等待任务队列中有任务。
任务缓存队列及排队策略:
workQueue用来存放等待执行的任务。workQueue的类型为BlockingQueue<Runnable>,通常取下面三种类型
1.ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小
2.LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAXVALUE。
3.synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务。
任务拒绝策略:
当线程池的任务缓存队列已满并且线程池中的线程数达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略,通常有以下4中策略:
1.ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectExecutionException异常
2.ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常
3.ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
4.ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
线程池的关闭
ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutDown()和shutDownNow(),
shutDown:不会立即终止线程,而是要等所有任务缓存队列中的任务都执行完后才终止,但不会接收新的任务
shutDownNow:立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务。
线程池容量的动态调整
ThreadPoolExecutor提供了动态调整线程池容量大小的方法:setCorePoolSize()和setMaximumPoolSize()
setCorePoolSize:设置核心池的大小
setMaximumPoolSize:设置线程池最大能创建线程数目大小
当上述参数从小变大时,ThreadPoolExecutor进行线程赋值,还可能立即创建新的线程来执行任务。
默认情况下,线程池是没有线程的,需要提交任务之后才创建线程。
在实际中如果需要创建之后立即创建线程,可以通过以下连个方法:
preStartCoreThread():初始化一个核心线程
preStartAllCoreThreads():初始化所有核心线程
public boolean preStartCoreThread(){
return addIfUnderCorePoolSize(null);
}
public int preStartAllCoreThreads(){
int n=0;
while(addIfUnderCorePoolSize(null)){
++n;
}
return n;
}
注意上面传进去的参数是null,根据分析可知如果传进去的参数为null,则最后执行线程会阻塞在getTask方法中的。
r=workQueue.take();及等待任务队列中有任务。
任务缓存队列及排队策略:
workQueue用来存放等待执行的任务。workQueue的类型为BlockingQueue<Runnable>,通常取下面三种类型
1.ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小
2.LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAXVALUE。
3.synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务。
任务拒绝策略:
当线程池的任务缓存队列已满并且线程池中的线程数达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略,通常有以下4中策略:
1.ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectExecutionException异常
2.ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常
3.ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
4.ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
线程池的关闭
ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutDown()和shutDownNow(),
shutDown:不会立即终止线程,而是要等所有任务缓存队列中的任务都执行完后才终止,但不会接收新的任务
shutDownNow:立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务。
线程池容量的动态调整
ThreadPoolExecutor提供了动态调整线程池容量大小的方法:setCorePoolSize()和setMaximumPoolSize()
setCorePoolSize:设置核心池的大小
setMaximumPoolSize:设置线程池最大能创建线程数目大小
当上述参数从小变大时,ThreadPoolExecutor进行线程赋值,还可能立即创建新的线程来执行任务。