这里写目录标题

  • 简介
  • newCachedThreadPool
  • newFixedThreadPool
  • newSingleThreadExecutor
  • newWorkStealingPool
  • newScheduledThreadPool

简介

Java通过Executors提供五种线程池,分别为:

  • newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  • newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  • newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
  • newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
  • newWorkStealingPool:创建一个ForkJoin线程池,线程数是CPU核数,可以充分利用CPU资源

newCachedThreadPool

分析构造方法的参数

public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
}
  • 初始线程数为:0
  • 最大线程数为:int的最大值
  • 超时时间为:1分钟
  • 阻塞队列采用的是:SynchronousQueue
  • 拒绝策略:默认策略(抛出异常)

根据参数可以得到以下结论

  • 这个线程池适用情况是短任务情况。
  • 采用SynchronousQueue,每当提交一个任务,都会超过阻塞队列的长度,导致创建线程,所以说:每当提交一个任务,都会创建一个线程,可能造成OOM。
  • 当线程空闲1分钟就会,销毁,所以该线程池会频繁的创建和销毁线程,最终会线程池会自己销毁
public class ExecutorsTest {public static void main(String[] args) throws InterruptedException {ThreadPoolExecutor executorService = (ThreadPoolExecutor) Executors.newCachedThreadPool();System.out.println("当前的线程数为:"+executorService.getActiveCount());executorService.execute(()-> System.out.println("========="));IntStream.range(0,100).boxed().forEach(i->executorService.execute(()->{try {TimeUnit.SECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+ " [ "+  i +" ]");}));TimeUnit.SECONDS.sleep(2);System.out.println("当前的线程数为:"+executorService.getActiveCount());}
}

结果

当前的线程数为:0
=========
当前的线程数为:100
当前的线程数为:0

newFixedThreadPool

public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}
  • 初始线程数为:nThreads
  • 最大线程数为:nThreads
  • 超时时间为:0毫秒
  • 阻塞队列采用的是:LinkedBlockingQueue
  • 拒绝策略:默认策略(抛出异常)

根据参数可以得到以下结论

  • 该线程池的线程数是用户自定义的,不会增加,不会减少,线程池不会自己销毁
  • 阻塞队列是无限大的,不会执行拒绝策略。
  • 可能会堆集无限的请求,导致OOM

newSingleThreadExecutor

public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));
}
  • 初始线程数为:1
  • 最大线程数为:1
  • 超时时间为:0毫秒
  • 阻塞队列采用的是:LinkedBlockingQueue
  • 拒绝策略:默认策略(抛出异常)

根据参数可以得到以下结论

  • 只有一个线程的固定线程池
  • 缺点和固定线程池一样
  • 只有ExecutorService方法

和一个线程的区别

newSingleThreadExecutor Thread
任务执行完成后,不会自动销毁,可以复用 任务执行完成后,会自动销毁
可以将任务存储在阻塞队列中,逐个执行 无法存储任务,只能执行一个任务

newWorkStealingPool


public static ExecutorService newWorkStealingPool(int parallelism) {return new ForkJoinPool(parallelism,ForkJoinPool.defaultForkJoinWorkerThreadFactory,null, true);
}
public static ExecutorService newWorkStealingPool() {return new ForkJoinPool(Runtime.getRuntime().availableProcessors(),ForkJoinPool.defaultForkJoinWorkerThreadFactory,null, true);
}//Returns the number of processors available to the Java virtual machine.
Runtime.getRuntime().availableProcessors()

分析源码我们可以得知

  • 采用的ForkJoin框架,可以将任务进行分割,同时线程之间会互相帮助
  • 最大的线程数是CPU核数,充分利用CPU资源

newScheduledThreadPool

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);
}
  • 创建的是一个定时的任务,每隔一段时间就会运行一次

首先可以对比的就是Timer这个类

public class ExecutorsTest {public static void main(String[] args) throws InterruptedException {Timer timer = new Timer();final TimerTask task = new TimerTask() {@Overridepublic void run() {System.out.println("=====" + System.currentTimeMillis());try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}}};timer.schedule(task,0,1000);}
}

结果

=====1589162310908
=====1589162312910
=====1589162314911
=====1589162316911

可以发现:如果任务时间超过了定时时长,就无法按照预定的时间执行

其他工具的解决方式

  • crontab定时处理器为了确保时间的正确性,会重新启一个线程

有三个方法

  • schedule(commod,delay,unit) ,这个方法是说系统启动后,需要等待多久执行,delay是等待时间。只执行一次,没有周期性。

  • scheduleAtFixedRate(commod,initialDelay,period,unit),这个是以period为固定周期时间,按照一定频率来重复执行任务,initialDelay是说系统启动后,需要等待多久才开始执行。例如:如果设置了period为5秒,线程启动之后执行了大于5秒,线程结束之后,立即启动线程的下一次,如果线程启动之后只执行了3秒就结束了那执行下一次,需要等待2秒再执行。这个是优先保证任务执行的频率,

  • scheduleWithFixedDelay(commod,initialDelay,delay,unit),这个是以delay为固定延迟时间,按照一定的等待时间来执行任务,initialDelay意义与上面的相同。例如:设置了delay为5秒,线程启动之后不管执行了多久,结束之后都需要先生5秒,才能执行下一次。这个是优先保证任务执行的间隔。

【详解】Executors框架之Executors相关推荐

  1. 详解工作流框架Activiti的服务架构和组件

    摘要:通过这篇文章,可以对工作流有一个基本的认识,为后续工作流框架Activiti的学习打下坚实的基础. 本文分享自华为云社区<BPMN工作流的基本概念!详解工作流框架Activiti的服务架构 ...

  2. jsp漂亮的登录界面源码_【案例+源码】详解MVC框架模式及其应用

    案例+源码]详解MVC框架模式及其应用 写在开头: 首先我们需要知道,框架模式.模式.开发模式是三种不同的概念,但他们的目的都一样:解耦! 1.关于MVC框架模型 MVC是三个单词的缩写: M,Mod ...

  3. 多图详解Spring框架的设计理念与设计模式

    Spring作为现在最优秀的框架之一,已被广泛的使用,51CTO也曾经针对Spring框架中的JDBC应用做过报道.本文将从另外一个视角试图剖析出Spring框架的作者设计Spring框架的骨骼架构的 ...

  4. 详解Spring框架的异步请求

    文章目录 详解Spring框架的异步请求 1.导入响应的jar包(gson) 2.前端请求 3.后端逻辑处理并返回结果 详解Spring框架的异步请求 在开发过程中有异步请求和同步请求之分. 同步请求 ...

  5. easyswoole默认访问html,详解PHP框架EasySwoole

    安装 使用 Composer 安装 composer require easyswoole/easyswoole=3.xphp vendor/bin/easyswoole install 启动框架 p ...

  6. java executors 详解_线程池—Executors 详解

    各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题 线 ...

  7. 详解spring框架入门到精通

    spring概述 spring框架的优点 spring框架的组成 spring核心IOC IOC概述 IOC入门案例 创建maven jar工程 引入spring的依赖 引入spring的核心配置文件 ...

  8. 抖音android x86,抖音数据采集教程,详解Hook框架frida,让你在逆向工作中效率成倍提升!...

    免责声明:本文档仅供学习与参考,请勿用于非法用途!否则一切后果自负. 一.frida简介frida是一款基于python + java 的hook框架,可运行在androidioslinuxwinos ...

  9. 详解Hook框架frida,为工作效率提速!

    一.frida简介 frida是一款基于python + java 的hook框架,可运行在androidioslinuxwinosx等各平台,主要使用动态二进制插桩技术.本期"安仔课堂&q ...

最新文章

  1. extjs gridpanel滚动条问题显示数据不完整
  2. Netty 在 Dubbo 中是如何应用的?
  3. tomcat启动时一闪而过的几种原因
  4. sql语句跨服务器跨数据库执行
  5. 【文摘】 雪念——作者:蓝色妖姬
  6. python中的列表和元组_python中列表和元组的区别
  7. SpringBoot连接Redis服务出现DENIED Redis is running in protected mode because protected mode is enabled
  8. 安装自己写的插件时,报插件版本过高,请升级JAR包或者安装低版本插件的问题
  9. 深入学习 Intellij IDEA 调试技巧
  10. regexp函数mysql_mysql中regexp_like()函数的例子解析
  11. ESP8266 WIFI 模块连接OneNet测试
  12. 时间换算--C语言结构练习
  13. 搜索 阿虚同学_凉宫春日阿虚台词“在虚构的故事当中寻求真实感的人脑袋一定有问题”动画是出自那一集?...
  14. 爬虫攻守道 - 2023最新 - JS逆向 - Python Scrapy实现 - 爬取某天气网站历史数据
  15. 工作中遇到的一些问题及解决办法
  16. 弘辽科技:降低ppc的3个环节4个核心点 。
  17. Python中的repr()函数与 ‘!r‘的作用
  18. js截取最后一个特定字符后面的字符串
  19. CSS之关于min-width、max-width、min-height和max-height的使用
  20. Fast unfolding of communities in large networks

热门文章

  1. spss菜单小介绍【跟阿婷一起学spss 03 在入坑边缘疯狂试探】
  2. 【渝粤题库】陕西师范大学165205 组织设计与人力资源规划 作业(专升本)
  3. 知道创宇CTO杨冀龙:网络安全人才决定行业格局
  4. 从单机到2000万 QPS 并发的 Redis 高性能缓存实践之路
  5. 基于Android的手机音乐播放器的设计
  6. Codeforces Round #552 (Div. 3) E stl模拟 F dp G gcd
  7. 如何对某一个文件夹下的所有文件快速重命名
  8. ClassNames
  9. Java多线程实现的两种方式
  10. 服务器主机安装win10系统稳定吗,服务器主机上安装win10