谈一谈线程池
Posted 开发小干货
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谈一谈线程池相关的知识,希望对你有一定的参考价值。
明天就休息啦
五一过后虽然只是上了两三天班,但还是觉得特别累,还好明天可以休息了(虽然只是休息一天)。
/ 前言 /
线程池无论是Java开发还是android开发都会用到的,对于一个Android开发者来说,用到的地方并不多。于是就有人想了,那你这篇文章进我的收藏夹里面吃灰吧,等我用到再说,好像挺有道理的样子,不过既然打开了,还是要读一读的哈。
今天主要就是从两点介绍一下线程池:线程池方法里的参数各个代表什么意思、线程池的分类。
/ 正文 /
1、线程池的应用场景
需要异步处理任务的情况下
2、ThreadPoolExecutor类
ThreadPoolExecutor类主要介绍一下它的构造方法,这里挑选一个参数最多的构造方法来介绍。
//1.corePoolSize: 该线程池中核心线程的数量。
//2.maximumPoolSize:该线程池中最大线程数量。(区别于corePoolSize)
//3.keepAliveTime:当线程数大于内核时,这是多余的空闲线程在终止新任务之前等待新任务的最大时间。注意:当allowCoreThreadTimeOut属性设为true时,该属性也可用于核心线程。
//4.unit:上面时间属性的单位
//5.workQueue:任务队列,后面详述。
//6.threadFactory:线程工厂,为线程池提供创建新线程的功能。ThreadFactory是一个接口,它只有一个方法,newThread(Runnable r),用来创建线程。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
...
}
3、线程池的分类
FixedThreadPool
CacheThreadPool
ScheduledThreadPool
SingleThreadExecutor
3.1、FixedThreadPool(固定线程池)
//特点:
//核心线程数和最大线程数相同.
//无超时时间
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(
nThreads, nThreads,
0L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>()
);
}
3.1.1、这是一种数量固定的线程池,当线程处于空闲的时候,并不会被回收,除非线程池被关闭。
3.1.2、当所有的线程都处于活动状态时,新任务都会处于等待状态,直到有线程空闲出来。
3.1.3、由于FixedThreadPool中只有核心线程并且这些核心线程不会被回收,这意味着它能够更加快速地响应外界的请求。
3.1.4、通过构造方法可以看出,FixedThreadPool只有核心线程,并且超时时间为0(即无超时时间),所以不会被回收。
3.2、CacheThreadPool(缓存线程池)
//无核心线程,并且最大线程数为int的最大值.
//超时时间为60s
//队列为SynchronousQueue同步阻塞队列,队列中没有任何容量.只有在有需求的情况下,队列中才可以试着添加任务.
public static ExecutorService newCacheThreadPool(){
return new ThreadPoolExecutor(
0,Integer.MAX_VALUE,
60L,TimeUnit.SECONDS,
new SynchronousQueue<Runnable>()
);
}
3.2.1、它是一种线程数量不定的线程池,它只有非核心线程,并且其最大线程数为Integer.MAX_VALUE(也就相当于线程池的线程数量可以无限大)。
3.2.2、当线程池中所有线程都处于活动的状态时,线程池会创建新的线程来处理新任务,否则就会复用空闲线程来处理。
3.2.3、值得注意的是,这个线程池中储存任务的队列是SynchronousQueue队列,这个队列可以理解为无法储存的队列,只有在可以取出的情况下,才会向其内添加任务。
3.2.4、从整个CacheThreadPool的特性来看:
(1)比较适合执行大量的耗时较少的任务。
(2)当整个线程都处于闲置状态时,线程池中的线程都会超时而被停止,这时候的CacheThreadPool几乎不占任何系统资源的。
3.3、ScheduledThreadPool(预定线程池)
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSzie) {
return new ScheduledThreadPoolExecutor(corePoolSzie);
}
//核心线程数是固定的,非核心线程无限大,并且非核心线程数有10s的空闲存活时间
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());
}
3.3.1、它的核心线程数量是固定的,而非核心线程数是没有限制的,并且当非核心线程闲置时会被立即回收。
3.3.2、ScheduThreadPool这类线程池主要用于执行定时任务和具有固定周期的重复任务。
3.3.3、而DelayedWorkQueue这个队列就是包装过的DelayedQueue,这个类的特点是在存入时会有一个Delay对象一起存入,代表需要过多少时间才能取出,相当于一个延时队列。
3.4、SingleThreadExecutor(单一线程池)
public static ExecutorService newSingleThreadExecutor() {
return Executors.newSingleThreadExecutor();
}
//特点:
//线程中只有一个核心线程
//并且无超时时间
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
3.4.1、这类线程池内部只有一个核心线程,它确保所有的任务都在同一个线程中按顺序执行。
3.4.2、SingleThreadExecutor的意义在于统一外界所有任务到一个线程,这使得这些任务之间不需要处理线程同步的问题。
4、submit()和execute()的区别
submit有返回值(runnableFuture),execute无返回值,submit()最终还是调用了execture()。
/ 最后 /
可以加我好友啦,微信搜索:sky_background
以上是关于谈一谈线程池的主要内容,如果未能解决你的问题,请参考以下文章