谈一谈线程池

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、线程池的分类

  1. FixedThreadPool

  2. CacheThreadPool

  3. ScheduledThreadPool

  4. 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