《阿里巴巴java开发手册》
线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
主要原因是使用Executors创建线程池不会传入这个参数而使用默认值所以我们常常忽略这一参数,而且默认使用的参数会导致资源浪费,不可取。

说明: Executors 返回的线程池对象的弊端如下:
1.FixedThreadPool 和 SingleThreadPool : 允许的请求队列长度为 Integer.MAX_VALUE ,可能会堆积大量的请求,从而导致 OOM 。
2.CachedThreadPool 和 ScheduledThreadPool : 允许的创建线程数量为 Integer.MAX_VALUE ,可能会创建大量的线程,从而导致 OOM 。

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

应用

RunnableTask.java

package com.person.threadpool;
/*** 任务类 :实现Runnable*/
public class RunnableTask implements Runnable{private int num;public RunnableTask(int num){this.num = num;}@Overridepublic void run() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}String threadName = Thread.currentThread().getName();String msg = "当前线程名 ["+threadName+"] 执行任务 [RunnableTask"+num+"] Done";System.out.println(msg);}}

ExecutorsnewSingleThreadExecutorTest.java

package com.person.threadpool;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ExecutorsnewSingleThreadExecutorTest {public static void main(String[] args) throws Exception{//线程池中只有一个线程,保证所有任务的执行顺序按照任务的提交顺序执行。//如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();// 提交多个任务for (int i = 1; i <= 10; i++) {RunnableTask task = new RunnableTask(i);// 任务
            newSingleThreadExecutor.submit(task);}//主线程休眠,确保任务都执行完成再关闭线程池Thread.currentThread().sleep(1000);newSingleThreadExecutor.shutdown();// 关闭线程池,如果还是线程没有执行完成则会继续执行,只是之后不能添加新的任务
    }}

ExecutorsnewFixedThreadPoolTest.java

package com.person.threadpool;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ExecutorsnewFixedThreadPoolTest {public static void main(String[] args) {// 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。//线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);// 提交多个任务for (int i = 1; i <= 10; i++) {RunnableTask task = new RunnableTask(i);// 任务
            newFixedThreadPool.submit(task);}newFixedThreadPool.shutdown();// 关闭线程池,如果还是线程没有执行完成则会继续执行,只是之后不能添加新的任务
    }}

ExecutorsnewCachedThreadPoolTest.java

package com.person.threadpool;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ExecutorsnewCachedThreadPoolTest {public static void main(String[] args) throws Exception{/*创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,*那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。*此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。*/ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();//提交多个任务for(int i=1;i<=10;i++){RunnableTask task = new RunnableTask(i);//任务
            newCachedThreadPool.submit(task);}//主线程暂停,确保执行后面的任务时,前面的任务全部执行完成Thread.currentThread().sleep(4000);System.out.println("==========================================");//重新让线程池执行任务,可以发现 线程池中的线程被重复利用for(int i=11;i<=20;i++){RunnableTask task = new RunnableTask(i);//任务
            newCachedThreadPool.submit(task);}//主线程休眠,确保任务都执行完成再关闭线程池Thread.currentThread().sleep(1000);//关闭线程池
        newCachedThreadPool.shutdown();}}

ExecutorsnewScheduledThreadPoolTest.java

package com.person.threadpool;import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ExecutorsnewScheduledThreadPoolTest {public static void main(String[] args) {//创建一个定长线程池,支持定时及周期性任务执行ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3);//延迟执行任务RunnableTask task = new RunnableTask(1);//任务newScheduledThreadPool.schedule(task, 3, TimeUnit.SECONDS); //也可以接收一个Callable实现类任务//周期性任务:延迟3秒执行第一次,每10秒执行一次,不关心上一次是否执行完成RunnableTask periodTask = new RunnableTask(4);//任务newScheduledThreadPool.scheduleAtFixedRate(periodTask, 3, 10, TimeUnit.SECONDS);//延迟3秒执行第一次任务,第一次执行完成再延迟10秒执行第二次,第二次执行完成再延迟10秒执行第三次....RunnableTask fixedDelayTask = new RunnableTask(8);//任务newScheduledThreadPool.scheduleWithFixedDelay(fixedDelayTask, 3, 10, TimeUnit.SECONDS);//newScheduledThreadPool.shutdown(); //当执行周期性任务时,不能关闭线程池,否则任务不被执行。
    }}

转载于:https://www.cnblogs.com/walixiansheng/p/9612522.html

Executors介绍相关推荐

  1. OOM分析之问题定位(二)

    一.背景 上一篇OOM分析之问题定位(一)中讲到通过单例模式可以有效的减少内存使用.但是随着压测并发数的不断提高,QRCodeTask对象不断增加,内存占用相应也会一直增加.再加上QRCodeTask ...

  2. 写给小白看的线程池,还有10道面试题

    如何搞定20k的面试小抄 为什么要用线程池呢? 下面是一段创建线程并运行的代码: for (int i = 0; i < 100; i++) {new Thread(() -> {Syst ...

  3. Executors框架——5种常用的线程池介绍及区别

    1. CachedThreadPool线程池(可向下转型为ThreadPoolExecutor) 1.1 线程池核心线程数是0,说明线程空闲时,会被自动回收. 1.2 任务队列只能有一个任务,而且最大 ...

  4. sqoop架构_SQOOP架构的深入介绍

    sqoop架构 by Jayvardhan Reddy 通过杰伊瓦尔丹·雷迪(Jayvardhan Reddy) SQOOP架构的深入介绍 (An in-depth introduction to S ...

  5. 为什么阿里巴巴要禁用 Executors 创建线程池?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 转自:掘金,作者:何甜甜在吗 juejin.im/post/5dc ...

  6. 为什么阿里巴巴要禁用Executors创建线程池?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:何甜甜在吗 juejin.im/post/5dc41c165 ...

  7. ThreadPoolExecutor使用介绍

    private static ExecutorService exec = new ThreadPoolExecutor(8, 8, 0L, TimeUnit.MILLISECONDS, new Li ...

  8. 为什么阿里不允许用Executors创建线程池

    1 文章概述 <阿里巴巴JAVA开发手册>有这样一条强制规定:线程池不允许使用Executors去创建,而应该通过ThreadPoolExecutor方式,这样处理方式更加明确线程池运行规 ...

  9. 线程返回值的方式介绍

    博客 微博 相册 收藏 留言 关于我 线程返回值的方式介绍 博客分类: 多线程 Java代码   在Java5之前,线程是没有返回值的,常常为了"有"返回值,破费周折,而且代码很不 ...

  10. Callable与Future的简单介绍

    Callable与Future的介绍 Callable与 Future 两功能是Java在后续版本中为了适应多并法才加入的,Callable是类似于Runnable的接口,实现Callable接口的类 ...

最新文章

  1. Kubuntu 9.10设置支持文件分级的方法
  2. 数据性能调校——查看最耗资源的各种SQL
  3. 奶茶妹妹亏本甩卖悉尼豪宅 当年与刘强东澳洲办盛大婚礼
  4. Qt C++属性类型提供给 QML调用(三)
  5. Spring Boot配置跨域访问策略
  6. os模块,os.path模块,subprocess模块,configparser模块,shutil模块
  7. Atitit 接口文档法 swaagger法 目录 1. Javadoc法 1 2. (9+条消息)swagger2常用注解说明 - 兴国-为梦想而战 - CSDN博客.html 1 2.1. 首
  8. 手机麦克风结构原理图_一文看懂咪头的工作原理及结构(驻极体话筒) - 全文...
  9. 如何将pdf中的矢量图另存为图片
  10. 偏执的interviewee
  11. Echarts直角坐标系x轴y轴属性设置大全
  12. VAD实现-读取语音数据、数据预处理、算法计算流程与框架
  13. 解决richedit的内容不能超过64k的方法
  14. node安装后的设置(node_global和node_cache)
  15. JVM性能监控及调优篇
  16. CANoe.DiVa 操作指南 - DTC自动化测试
  17. python dwg文件_Python将dwg文件转换为shapefi
  18. MATLAB代码:基于蒙特卡洛抽样的电动汽车充电负荷计算
  19. HTML、CSS综合04——浮动、定位、选择器
  20. Win10 微软输入法(微软拼音) 不显示 选字栏(无法选字) 解决方法

热门文章

  1. Java Web开发实战—简介篇
  2. vue 方法回调通知执行下一个方法
  3. 深圳瑞光康泰RBP-9000C血压仪对接
  4. 跑跑卡丁车rush服务器维护,跑跑卡丁车Rush+测试服
  5. Xcode添加include目录
  6. LINUX编译autoconf
  7. NLPIR java测试(没找到范例代码)
  8. LINUX安装fossil
  9. error: passing ‘const AppJniCommand’ as ‘this’ argument discards qualifiers [-fpermissive]
  10. BAT判断一个目录是否存在