//工作中只用这种//最大线程数定义 1.CPU密集型 几核就是几 可保证CPU效率最高Runtime.getRuntime().availableProcessors();//获取CPU核数//IO密集型 判断程序中十分消耗IO资源线程大于这个数
//        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,//核心线程数ExecutorService threadPoolExecutor = new ThreadPoolExecutor(2,//核心线程数5,//最大线程数1,//超时时间TimeUnit.SECONDS,//单位秒new LinkedBlockingQueue<>(3),//任务队列,设置队列大小Executors.defaultThreadFactory(),//线程工厂,默认线程工厂new ThreadPoolExecutor.AbortPolicy());//拒绝策略

定长线程池(FixedThreadPool)

//特点:只有核心线程,线程数量固定,执行完立即回收。
//任务队列为链表结构的有界队列:LinkedBlockingQueue
//一个基于链表结构的阻塞队列,此队列按FIFO (先进先出)排序元素,
//吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列
//应用场景:一个固定大小的线程池,可以用于已知并发压力的情况下,对线程数做限制,控制线程最大并发数。ExecutorService executorService = Executors.newFixedThreadPool(5);try {//最大承载为队列+最大线程数for (int i = 0; i < 10; i++) {//使用线程池创建线程scheduledExecutorService.execute(() -> {System.out.println(Thread.currentThread().getName());});}}finally {//线程池用完要关闭scheduledExecutorService.shutdown();}

单线程化线程池(SingleThreadExecutor)

//特点:只有 1 个核心线程,无非核心线程,执行完立即回收。
// 任务队列为链表结构的有界队列:LinkedBlockingQueue
// 一个基于链表结构的阻塞队列,此队列按FIFO (先进先出)排序元素吞吐量通常要高于ArrayBlockingQueue。
// 静态工厂方法Executors.newFixedThreadPool()使用了这个队列
// 应用场景:一个单线程的线程池,可以用于需要保证顺序执行的场景,并且只有一个线程在执行。
// 不适合并发但可能引起 IO 阻塞性及影响 UI 线程响应的操作,如数据库操作、文件操作等。ExecutorService executorService = Executors.newSingleThreadExecutor();

可缓存线程池(CachedThreadPool)

//特点:无核心线程,非核心线程数量无限,执行完闲置 60s 后回收。
//任务队列为不存储元素的阻塞队列:SynchronousQueue
//一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,
// 否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,
// 静态工厂方法Executors.newCachedThreadPool使用了这个队列。
// 应用场景:执行大量、耗时少的任务。一个可以无限扩大的线程池,比较适合处理执行时间比较小的任务。ExecutorService executorService = Executors.newCachedThreadPool();

//定时线程池(ScheduledThreadPool )

//特点:核心线程数量固定,非核心线程数量无限,执行完闲置 10ms 后回收。
//任务队列为延时阻塞队列:DealyQueue
//应用场景:执行定时或周期性的任务。定时启动的线程池,适用于需要多个后台线程执行周期任务的场景。ScheduledExecutorService scheduledExecutorService =Executors.newScheduledThreadPool(5);

线程池的核心参数:

corePoolSize(必需):核心线程数。默认情况下,核心线程会一直存活,但是当将 allowCoreThreadTimeout 设置为 true 时,核心线程也会超时回收。maximumPoolSize(必需):线程池所能容纳的最大线程数。当活跃线程数达到该数值后,后续的新任务将会阻塞。keepAliveTime(必需):线程闲置超时时长。如果超过该时长,非核心线程就会被回收。如果将 allowCoreThreadTimeout 设置为 true 时,核心线程也会超时回收。unit(必需):指定 keepAliveTime 参数的时间单位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分)。workQueue(必需):任务队列。通过线程池的 execute() 方法提交的 Runnable 对象将存储在该参数中。其采用阻塞队列实现。threadFactory(可选):线程工厂。用于指定为线程池创建新线程的方式。(一般不用动)handler(可选):拒绝策略。当达到最大线程数时需要执行的饱和策略。

线程池的拒绝策略:

 当请求任务不断的过来,而系统此时又处理不过来的时候,我们需要采取的策略是拒绝服务。RejectedExecutionHandler接口提供了拒绝任务处理的自定义方法的机会。在ThreadPoolExecutor中已经包含四种处理策略。AbortPolicy(中止策略)策略:该策略会直接抛出异常,阻止系统正常工作。CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。DiscardPolicy策略:忽略新任务;不予任何处理。除了JDK默认提供的四种拒绝策略,我们可以根据自己的业务需求去自定义拒绝策略,自定义的方式很简单,直接实现RejectedExecutionHandler接口即可。

execute和submit的区别:

线程池执行任务是用的execute方法,除了execute方法,还有一个submit方法也可以执行我们提交的任务。这两个方法有什么区别呢?分别适用于在什么场景下呢?execute适用于不需要关注返回值的场景,只需要将线程丢到线程池中去执行就可以了。submit方法适用于需要关注返回值的场景

Executors线程池相关推荐

  1. Executors线程池关闭时间计算

    Executors线程池关闭时间计算 学习了:http://blog.csdn.net/wo541075754/article/details/51564359 https://www.cnblogs ...

  2. Java Executor源码解析(7)—Executors线程池工厂以及四大内置线程池

    详细介绍了Executors线程池工具类的使用,以及四大内置线程池. 系列文章: Java Executor源码解析(1)-Executor执行框架的概述 Java Executor源码解析(2)-T ...

  3. Java Executors(线程池)

    Sun在Java5中,对 Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程 ...

  4. Executors 线程池的7个参数详解

    线程池创建有7个参数 下面为构造函数 /** * Creates a new {@code ThreadPoolExecutor} with the given initial * parameter ...

  5. Executors线程池详解(全)

    开场白 构造一个线程池为什么需要几个参数?如果避免线程池出现OOM? Runnable 和 Callable 的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常见场景和代码片段. 基础 ...

  6. java多线程——Executors线程池的四种用法简单解析

    1.Executors.newFixedThreadPool(5)    是创建一个线程池,池子里面有5个线程,任务数多余5个时,超出的任务队列中排队等候执行 2.Executors.newCache ...

  7. Executors线程池知识点总结

    线程池的自我介绍 思考 如果不使用线程池,我们可能需要每次任务都新开一个线程来处理. 如果只有一个线程 public class oneThread {public static void main( ...

  8. DownloadManager+NumberProgressBar+Executors线程池实现多并发下载APK安装

    在github上面苦苦寻找都木有找到有关Android自带下载器DownloadManager多并发下载的,于是就决定自己试试写一个. 先上个图: 我的上篇文章 http://blog.csdn.ne ...

  9. java executors 详解_线程池Executors详解

    为什么要用线程池呢? 一是减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务; 二是可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累 ...

最新文章

  1. android 序列化_Android高级架构进阶之数据传输与序列化
  2. vue+mint-ui地址三级or四级联动
  3. 智源研究院联合多家权威机构上线“新冠肺炎(COVID-19)开放数据源”,打造全面、精细的新冠数据平台...
  4. P2396-yyylovesMathsVII【状压dp】
  5. JavaOne大事纪:IBM谈OpenJ9和Open Liberty
  6. 平面设计师必读的十本书
  7. Ockam为物联网设备带来区块链无服务器身份识别
  8. 鸟哥linux基础篇学完到什么程度,学完了《鸟哥Linux私房菜》大体回顾以及感悟。...
  9. C#简单银行管理系统含源码(.net C# web)
  10. QC七大手法(New)
  11. 多媒体计算机辅助英语教学,多媒体计算机辅助英语教学
  12. 惩罚函数法例题matlab,外点惩罚函数法例题
  13. unity 贴图合并_[2018.4]Unity版本迭代与效果提升
  14. Win32 CMD批处理命令
  15. pycharm print 显示红色下划线
  16. 【孵化器系列采访】创新工场:高端人才成功创业的聚集地
  17. rhel配置DNS分析+实验
  18. Jenkins基础:API:10:使用API更新进行节点的连接和断开
  19. 小额贷款的趣店赴美上市 到底值不值100亿美元?
  20. 微商红利落幕,互联网创业如何破局?

热门文章

  1. hdu3311 Dig The Wells(斯坦纳树模板题)
  2. 看完马云演讲后的感受
  3. 【开源硬件】STM32F030R8T6系统板
  4. 【分享】手机测试之详谈
  5. linux设备树笔记__基于msm8x10的基本分析
  6. 每日做题总结——day01
  7. 使用VBS制作小程序,提醒记录每日工作
  8. 如何关闭WinDefender(亲测有效)
  9. 数据结构python-第三节
  10. WEB>SSRF(URL Bypass,数字IP Bypass,302跳转Bypass,DNS重绑定Bypass)