线程池
2019-10-28 本文已影响0人
cao苗子
1.线程池的定义:
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
2.线程池ThreadPoolExecutor
先看参数介绍
//线程队列
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(4);
//线程创建工厂,如果需要创建线程就调用这个方法来创建
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
Log.d("TAG","创建线程:"+thread.getName());
return thread;
}
};
//核心线程数,就是线程里面的核心线程数量
private static final int CORE_POOL_SIZE = 4;
//最大线程数,就是线程池中最大线程数
private static final int MAXIMUM_POOL_SIZE = 10;
//线程的存活时间,就是线程执行完毕之后,超过这个时间没有任务,就自动销毁
private static final int KEEP_ALIVE_TIME = 60;
//线程存活的时间单位
private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS;
3.使用列子和说明
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAXIMUM_POOL_SIZE,
KEEP_ALIVE_TIME,
TIME_UNIT,
sPoolWorkQueue,
sThreadFactory
);
//LinkedBlockingQueue:是一个阻塞队列,先进先出。
//PriorityBlockingQueue:无序,可以根据优先级进行排序
//SynchronousQueue: 线程安全
//如果sPoolWorkQueue的大小等4的时候 会报错:RejectedExecutionException
//报错原因:其实也是AsyncTask存在的隐患,比如我要执行200个Runnable就肯定会报错
//AsyncTask中的sPoolWorkQueue是:128
//分析:线程队列:4,核心线程数:4,最大线程数:10,目前需要加入的线程数是:20
// 如果20个都要放入到线程队列,线程队列只有4个,还有16个没有办法放入;由于最大
//线程数是10个,有6个是非核心线程数,所以这个时候会创建6个线程来使用,就达到
//最大线程数10了,但是还有10线程没有办法创建,所以这个时候就会抛出异常
//RejectedExecutionException
for( int i = 0 ; i < 20 ; i++ ){
final Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("TAG","线程执行:"+ Thread.currentThread().getName());
}
};
threadPoolExecutor.execute(runnable);
}