线程池作用就是限制系统中执行线程的数量。根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
在java中线程池一般使用ThreadPoolExecutor来创建
threadTest = new ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
参数:
参数名 | 参数作用 |
---|---|
核心线程数corePoolSize | 保持在池中的线程数 |
最大线程数maximumPoolSize | 最多创建线程数量,当超过该设置参数的线程数时,抛出异常 |
保活时间keepAliveTime | 线程数大于corePoolSize,闲置线程最大空闲时间 |
时间单位unit | TimeUnit是一个枚举类型,翻译过来就是时间单位,我们最常用的时间单位包括: |
MILLISECONDS | 1毫秒 、SECONDS : 秒、MINUTES : 分、HOURS : 小时、DAYS : 天 |
阻塞队列workQueue | 该线程池中的任务队列:维护着等待执行的Runnable对象。当所有的核心线程都在干活时,新添加的任务会被添加到这个队列中等待处理,如果队列满了,则新建非核心线程执行任务 |
执行线程池任务
threadTest.execute(new Runnable(){
@Override
public void run(){
//logHelper.w("create thread");
}
});
创建线程时,当创建线程数未达到corePoolsize,则会系统会自动新建一些线程,保持线程数量与corePoolsize上参数的数量相等。
创建线程数超过maximumPoolSize,抛出异常
其他两种线程池
线程池方面,JDK 为我们内置了其他两种线程池:
newFixedThreadPool:newFixedThreadPool,创建固定大小的线程池,poolCoreSize和maxPoolSize 相等,到达coreSize,则将新的任务放到缓存队列,有线程执行完毕,直接去取。
newCacheThreadPool:newCacheThreadPool,无大小限制的线程池,提交一个任务就创建一个线程执行。
如果默认的几种线程池还不能满足你的需求,那就试一试自定义线程池