Java线程池详解

newCachedThreadPool是Executors工厂类的一个静态函数,用来创建一个可以无限扩大的线程池。

而Executors工厂类一共可以创建四种类型的线程池,通过Executors.newXXX即可创建。下面就分别都介绍一下。

1. FixedThreadPool

public static ExecutorService newFixedThreadPool(int nThreads){

    return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue());

}


它是一种固定大小的线程池;

corePoolSize和maximunPoolSize都为用户设定的线程数量nThreads;

keepAliveTime为0,意味着一旦有多余的空闲线程,就会被立即停止掉;但这里keepAliveTime无效;

阻塞队列采用了LinkedBlockingQueue,它是一个无界队列;

由于阻塞队列是一个无界队列,因此永远不可能拒绝任务;

由于采用了无界队列,实际线程数量将永远维持在nThreads,因此maximumPoolSize和keepAliveTime将无效。

2. CachedThreadPool

public static ExecutorService newCachedThreadPool(){

    return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.MILLISECONDS,new SynchronousQueue());

}


它是一个可以无限扩大的线程池;

它比较适合处理执行时间比较小的任务;

corePoolSize为0,maximumPoolSize为无限大,意味着线程数量可以无限大;

keepAliveTime为60S,意味着线程空闲时间超过60S就会被杀死;

采用SynchronousQueue装等待的任务,这个阻塞队列没有存储空间,这意味着只要有请求到来,就必须要找到一条工作线程处理他,如果当前没有空闲的线程,那么就会再创建一条新的线程。

3. SingleThreadExecutor

public static ExecutorService newSingleThreadExecutor(){

    return new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue());

}


它只会创建一条工作线程处理任务;

采用的阻塞队列为LinkedBlockingQueue;


4. ScheduledThreadPool

它用来处理延时任务或定时任务。


它接收SchduledFutureTask类型的任务,有两种提交任务的方式:

scheduledAtFixedRate

scheduledWithFixedDelay

SchduledFutureTask接收的参数:

time:任务开始的时间

sequenceNumber:任务的序号

period:任务执行的时间间隔

它采用DelayQueue存储等待的任务

DelayQueue内部封装了一个PriorityQueue,它会根据time的先后时间排序,若time相同则根据sequenceNumber排序;

DelayQueue也是一个无界队列;

工作线程的执行过程:

工作线程会从DelayQueue取已经到期的任务去执行;

执行结束后重新设置任务的到期时间,再次放回DelayQueue


摘自:
https://www.zhihu.com/question/23212914/answer/245992718

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 13,911评论 4 56
  • 转载:https://www.jianshu.com/p/47e903ab1bec 一、概述 在我们的开发中经常会...
    郭某人1阅读 4,693评论 1 0
  • 本篇文章讲述Java中的线程池问题,同样适用于Android中的线程池使用。本篇文章参考:Java线程池分析,Ja...
    Ruheng阅读 11,973评论 1 64
  • 今年我二十四岁,我的奶奶七十二岁。 我曾感慨奶奶很厉害,她的第一个孙子出生的时候她才四十多岁。哥哥是大孙子,今年三...
    帅沙弥阅读 1,792评论 0 0
  • 这次参加训练营,虽然没完成打卡外,写了二十三篇文章,并认识了无戒老师和一群优秀小伙伴。曾经以为大牌都很傲,没想到无...
    蔷薇花儿落地开阅读 2,312评论 8 9

友情链接更多精彩内容