Java中四种具有不同功能常见的线程池。他们都是直接或者间接配置 ThreadPoolExecutor来实现他们各自的功能。这四种线程池分别是newFixedThreadPool, newCachedThreadPool ,
newScheduledThreadPoolnewSingleThreadExecutor。这四个线程池可以通过Executors类获取。
1. newFixedThreadPool
通过Executors中的newFixedThreadPool方法来创建,该线程池是一种线程数量固定的线程池。
ExecutorService service = Executors.newFixedThreadPool(4);

在这个线程池中,所容纳的最大线程数就是就是设置的核心线程数。如果线程池中的线程处于空闲状态的话,并不会被回收,除非是这个线程池被关闭。如果所有的线程都处于活动状态的话,新任务就会处于等待状态,直到有线程空闲出来。

2. newCachedThreadPool
通过Executors中的newCachedThreadPool方法来创建。
public static ExecutorService newCachedThreadPool()
{ return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L,TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
}
       通过上面的newCachedThreadPool方法在这里我们可以看出它的核心线程数为 0, 线程池的最大线程数Integer.MAX_VALUE。而Integer.MAX_VALUE是一个很大的数,也差不多可以说 这个线程池中的最大线程数可以任意大。
       当线程池中的线程都处于活动状态的时候,线程池就会创建一个新的线程来处理任务。该线程池中的线程超时时长为60秒,所以当线程处于闲置状态超过60秒的时候便会被回收。 这也就意味着若是整个线程池的线程都处于闲置状态超过60秒以后,在newCachedThreadPool线程池中是不存在任何线程的,所以这时候它几乎不占用任何的系统资源。
3. newScheduledThreadPool
通过Executors中的newScheduledThreadPool方法来创建。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
它的核心线程数是固定的,对于非核心线程几乎可以说是没有限制的,并且当非核心线程处于限制状态的时候就会立即被回收。
创建一个可定时执行或周期执行任务的线程池:
ScheduledExecutorService service = Executors.newScheduledThreadPool(4);service.schedule(new Runnable() {public void run() {System.out.println(Thread.currentThread().getName() + "延迟三秒执行");}}, 3, TimeUnit.SECONDS);service.scheduleAtFixedRate(new Runnable() {public void run() {System.out.println(Thread.currentThread().getName() + "延迟三秒后每隔2秒执行");}}, 3, 2, TimeUnit.SECONDS);
输出结果:

pool-1-thread-2延迟三秒后每隔2秒执行
pool-1-thread-1延迟三秒执行
pool-1-thread-1延迟三秒后每隔2秒执行
pool-1-thread-2延迟三秒后每隔2秒执行
pool-1-thread-2延迟三秒后每隔2秒执行

schedule(Runnable command, long delay, TimeUnit unit) :延迟一定时间后执行Runnable任务;
schedule(Callable callable, long delay, TimeUnit unit) :延迟一定时间后执行Callable任务;
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) :延迟一定时间后,以间隔period时间的频率周期性地执行任务;
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay,TimeUnit unit) :与scheduleAtFixedRate()方法很类似,但是不同的是scheduleWithFixedDelay()方法的周期时间间隔是以上一个任务执行结束到下一个 任务开始执行的间隔,而scheduleAtFixedRate()方法的周期时间间隔是以上一个任务开始执行到下一个任务开始执行的间隔,也就是这一些任务系列的触发时间都是可预知的。
ScheduledExecutorService功能强大,对于定时执行的任务,建议多采用该方法。
4. newSingleThreadExecutor

通过Executors中的newSingleThreadExecutor方法来创建,在这个线程池中只有一个核心线程,对于任务队列没有大小限制,也就意味着这一个任务处于活动状态时,其他任务都会在任务队列中排队等候依次执行。
newSingleThreadExecutor将所有的外界任务统一到一个线程中支持,所以在这个任务执行之间我们不需要处理线程同步的问题。
public static ExecutorService newSingleThreadExecutor(){return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()));}

Java四种线程池类相关推荐

  1. [转]new Thread的弊端及Java四种线程池的使用

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new ...

  2. Java 四种线程池

    原文 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下n ...

  3. Java四种线程池使用

    Java 四种线程池的使用 https://juejin.im/post/59df0c1af265da432f301c8d 1,线程池的作用  线程池作用就是限制系统中执行线程的数量.  根据系统的环 ...

  4. Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor...

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() {@Override public void run ...

  5. Java 四种线程池的用法分析

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() {@Overridepublic void run() {// ...

  6. Java四种线程池及new Thread的弊端

    new Thread 的弊端 执行异步任务只是如下 new Thread() 吗? new Thread(new Runnable() {@Overridepublic void run() {// ...

  7. new thread java_谈谈new Thread的弊端及Java四种线程池的使用

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  8. Java四种线程池的使用 1

    Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...

  9. java四种线程池类型以及可选择的阻塞队列

    之前笔记有记录java线程池的拒绝策略,回顾一下线程池的处理任务的优先级: 先考虑corePoolSize.任务队列(缓冲队列)workQueue.最大线程maximumPoolSize,如果三者都满 ...

最新文章

  1. 原360首席科学家颜水成正式加入依图科技,任首席技术官
  2. nginx三大功能(之二负载均衡)
  3. CTFshow 命令执行 web37
  4. Thinkphp5.0上传图片与运行python脚本
  5. Centos配置在线yum源
  6. 密位测距离口诀_电气故障怎么查?最新最全的79条电气故障诊断口诀
  7. 【转】Dicom文件解析!!!!!!
  8. Developer Express 之 XtraReport如何动态绑定数据
  9. 鼠标移开事件(onmouseout)
  10. cad 打开硬件加速卡_CAD运行用加速技巧
  11. HTML inline 与block元素
  12. 腾讯正式开源高性能Hybrid框架VasSonic!
  13. 微软Exchange Server 2010 SP1下载
  14. C语言实例(六)创建各类三角形
  15. 奶茶店收银系统php版,奶茶店收银系统
  16. LDA模型:建立词典+文本数量+建立文档TF-IDF+LDA模型拟合
  17. 【时间转换】将秒转换成“时分秒”格式
  18. VMware安装windows server2008R2x64
  19. AM335X 内存配置
  20. python面试自我介绍_python自我描述

热门文章

  1. python与selenium_项目篇_项目实战、代码优化、项目重构
  2. 几种杀毒软件的鲜明对比
  3. span based model
  4. 有限元分析软件都有哪些,各自的优缺点是什么
  5. 异或运算 ^(xor)小解
  6. FileZilla设置个人文件夹
  7. DB2数据库学习之数据库备份还原
  8. Linux dmidecode命令的使用
  9. VSCode插件开发 国际化
  10. Brave浏览器安装在deepin linux上,报错