专栏名称: java那些事
分享java开发中常用的技术,分享软件开发中各种新技术的应用方法。每天推送java技术相关或者互联网相关文章。关注“java那些事”,让自己做一个潮流的java技术人!《java程序员由笨鸟到菜鸟》系列文章火热更新中。
目录
相关文章推荐
芋道源码  ·  Java 新魔法:利用 Function ... ·  18 小时前  
芋道源码  ·  Nginx 部署负载均衡服务全解析 ·  2 天前  
芋道源码  ·  SpringBoot CORS ... ·  2 天前  
芋道源码  ·  如何快速同步第三方平台数据? ·  4 天前  
芋道源码  ·  DeepSeek 全面指南:95% ... ·  4 天前  
51好读  ›  专栏  ›  java那些事

Java的四种线程池的使用,以及自定义线程工厂

java那些事  · 公众号  · Java  · 2019-01-11 16:00

正文

四种线程池

四种线程池分别是:newCachedThreadPool、newFixedThreadPool 、newScheduledThreadPool 和newSingleThreadExecutor ,下面对这几个线程池一一讲解。

newCachedThreadPool :可缓存的线程池

源码:

newCachedThreadPool的方法中是返回一个ThreadPoolExecutor实例,从源码中可以看出该线程池的特点:

1、该线程池的核心线程数量是0,线程的数量最高可以达到 Integer 类型最大值;

2、创建ThreadPoolExecutor实例时传过去的参数是一个SynchronousQueue实例,说明在创建任务时,若存在空闲线程就复用它,没有的话再新建线程。

3、线程处于闲置状态超过60s的话,就会被销毁。

用法:

上面的代码因为每次循环都是隔一秒执行,这个时间足够之前的线程工作完毕,并在新循环中复用这个线程,程序的运行结果如下:

newFixedThreadPool :定长线程池

源码:

线程池特点:

1、线程池的最大线程数等于核心线程数,并且线程池的线程不会因为闲置超时被销毁。

2、使用的列队是 LinkedBlockingQueue ,表示如果当前线程数小于核心线程数,那么即使有空闲线程也不会复用线程去执行任务,而是创建新的线程去执行任务。如果当前执行任务数量大于核心线程数,此时再提交任务就在队列中等待,直到有可用线程。

用法:

定义一个线程数为3的线程池,循环10次执行,可以发现运行的线程永远只有三个,结果如下:

newSingleThreadExecutor :单线程线程池

源码:

从源码就可以看出,该线程池基本就是只有一个线程数的 newFixedThreadPool ,它只有一个线程在工作,所有任务按照指定顺序执行。

用法:

和newFixedThreadPool类似,只是一直只有一个线程在工作,这里就不贴代码了。

newScheduledThreadPool :支持定时的定长线程池

源码:

newScheduledThreadPool的方法不是直接返回一个ThreadPoolExecutor实例,而是通过有定时功能的ThreadPoolExecutor,也就是 ScheduledThreadPoolExecutor 来返回ThreadPoolExecutor实例,从源码中可以看出:

1、该线程池可以设置核心线程数量,最大线程数与newCachedThreadPool一样,都是Integer.MAX_VALUE。

2、该线程池采用的队列是DelayedWorkQueue,具有延迟和定时的作用。

用法:

自定义ThreadFactory

四种线程池的使用就说到这里了,值得说明的是,除了上面的参数外,Executors类中还给这四种线程池提供了可传 ThreadFactory 的重载方法,以下是它们的源码:

ThreadFactory是一个接口类,也就是我们经常说的线程工厂,只有一个方法,可以用于创建线程:


Thread newThread (Runnable r) ;


默认情况下,ThreadPoolExecutor构造器传入的 ThreadFactory







请到「今天看啥」查看全文