AsyncTask两种线程池
1.THREAD_POOL_EXECUTOR, 异步线程池
1 |
MyAsyncTask
asynct = new
MyAsyncTask(task); |
2 |
asynct.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
0 ); |
corePoolSize
=CPU核心数+1;2.
maximumPoolSize
=2倍的CPU核心数+1;3.核心线程无超时机制,非核心线程在闲置时间的超时时间为
1s
;4.任务队列的容量为
128
。- 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
- 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
- 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
- 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
- 当线程池中的线程数量大于 corePoolSize时,如果某线程(非核心线程)空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
2.SERIAL_EXECUTOR,同步线程池
1 |
a.
asynct.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, 0 ); |
2 |
b.
asynct.execute( 0 ); |
AsyncTask在不同SDK版本中的区别
1、线程池中的工作线程少于5个时,将会创建新的工作线程执行异步任务(红色表示新任务,下同)
2、线程池中已经有5个线程,缓冲队列未满,异步任务将会放到缓冲队列中等待
3、线程池中已经有5个线程,缓冲队列已满,那么线程池将新开工作线程执行异步任务
问题:Android的设备一般不超过2个cpu核心,过多的线程会造成线程间切换频繁,消耗系统资源。
4、线程池中已经有128个线程,缓冲队列已满,如果此时向线程提交任务,将会抛出RejectedExecutionException
问题:抛出的错误不catch的话会导致程序FC。