java并发编程笔记(七)——线程池

  • new Thread弊端

    • 每次new Thread新建对象,性能差
    • 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM
    • 缺少更多功能,如更多执行、定期执行、线程中断
  • 线程池的好处
    • 重用存在的线程,减少对象创建、消亡的开销,性能佳
    • 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞
    • 提供定时执行、定期执行、单线程、并发数控制等功能

ThreadPoolExecutor

重要核心参数

  • corePoolSize:核心线程数量

  • maximuPoolSize:线程池最大线程数

  • workQueue:阻塞队列,存储等待执行的任务,很重要,会对线程池运行过程产生重大影响

  • keepAliveTime:线程没有任务执行的时候最多保持多久时间终止,比如任务量低于核心线程数的时候,线程需要再等待多久才可以释放掉线程

  • unit:keepAliveTime的时间单位

  • threadFactory:线程工厂,用来创建线程,能够使创建的线程具有相同的优先级,并且是非守护的线程,同时也设置了线程的名称,

  • rejectHandler:当拒绝处理任务时的策略

    • 直接抛出异常
    • 用调用者所在的线程来执行任务
    • 丢弃队列中最靠前的任务来释放线程执行当前任务
    • 直接丢弃当前任务

线程池的五种状态

  • RUNNING:能够接受新提交的任务,也能处理阻塞队列中的任务,

  • (pool.shutdown())SHUTDOWN:关闭状态,不能接受新提交的任务,但是能够处理阻塞队列中保存的任务

  • (pool.shutdownNow())STOP:不能接受新的任务,也不能处理阻塞队列中的任务,会中断正在处理中的线程。

  • TIDYING:阻塞队列为空,线程池中的工作线程数为0

  • (pool.terminated()) TERMINATED

线程池的相关方法

  • execute():提交任务,交给线程池执行

  • submit():提交任务,能够返回执行结果 execute + Future

  • shutdown():关闭线程池,等待任务都执行完

  • shutdownNow():关闭线程池,不等待任务执行完

  • getTaskCount():线程池已执行和未执行的任务总数

  • getCompletedTaskCount():已完成的任务数量

  • getPoolSize():线程池当前的线程数量

  • getActiveCount():当前线程池中正在执行任务的线程数量

Executor框架接口

  • Executors.newCachedThreadPool

  • Executors.newFixedThreadPool

  • Executors.newScheduledThreadPool

    @Slf4j
    public class ThreadPoolExample4 { public static void main(String[] args) { ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); // executorService.schedule(new Runnable() {
    // @Override
    // public void run() {
    // log.warn("schedule run");
    // }
    // }, 3, TimeUnit.SECONDS); executorService.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
    log.warn("schedule run");
    }
    }, 1, 3, TimeUnit.SECONDS);
    // executorService.shutdown(); Timer timer = new Timer();
    timer.schedule(new TimerTask() {
    @Override
    public void run() {
    log.warn("timer run");
    }
    }, new Date(), 5 * 1000);
    }
    }
  • Executors.newSingleThreadExecutor

线程池的合理配置

  • CPU密集型任务,就需要尽量压榨CPU,参考值可以设置为N(cpu) + 1
  • IO密集型任务,参考值可以设置为2*N(cpu)

java并发编程笔记(七)——线程池的更多相关文章

  1. 【Java并发编程六】线程池

    一.概述 在执行并发任务时,我们可以把任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程,只要池里有空闲的线程,任务就会分配一个线程执行.在线程池的内部,任务被插入一个阻塞队列(Blo ...

  2. Java并发编程笔记4-线程池

    我们使用线程的时候就去创建一个线程,但是就会有一个问题: 如果并发的线程数量非常多,而且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会导致大大降低系统的效率,因为频繁创建线程和销毁线 ...

  3. Java并发编程 (九) 线程调度-线程池

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 声明:实际上,在开发中并不会普遍的使用Thread,因为它具有一些弊端,对并发性能的影响比较大,如下: ...

  4. java并发编程笔记(五)——线程安全策略

    java并发编程笔记(五)--线程安全策略 不可变得对象 不可变对象需要满足的条件 对象创建以后其状态就不能修改 对象所有的域都是final类型 对象是正确创建的(在对象创建期间,this引用没有逸出 ...

  5. java并发编程笔记(三)——线程安全性

    java并发编程笔记(三)--线程安全性 线程安全性: ​ 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...

  6. java并发编程笔记(九)——多线程并发最佳实践

    java并发编程笔记(九)--多线程并发最佳实践 使用本地变量 使用不可变类 最小化锁的作用域范围 使用线程池Executor,而不是直接new Thread执行 宁可使用同步也不要使用线程的wait ...

  7. Java并发编程系列-(2) 线程的并发工具类

    2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...

  8. java并发编程笔记(十)——HashMap与ConcurrentHashMap

    java并发编程笔记(十)--HashMap与ConcurrentHashMap HashMap参数 有两个参数影响他的性能 初始容量(默认为16) 加载因子(默认是0.75) HashMap寻址方式 ...

  9. java并发编程笔记(八)——死锁

    java并发编程笔记(八)--死锁 死锁发生的必要条件 互斥条件 进程对分配到的资源进行排他性的使用,即在一段时间内只能由一个进程使用,如果有其他进程在请求,只能等待. 请求和保持条件 进程已经保持了 ...

随机推荐

  1. Mac009--Axure RP安装

    Mac--Axure RP安装 一.下载Axure RP8.0 下载网址:https://www.axure.com/download  (下载mac版本) Axure RP说明: Axure RP是 ...

  2. Postman初接触

    https://www.getpostman.com/docs/postman/launching_postman/installation_and_updates

  3. C++学习笔记(三)--数组、字符串

    1.数组,C++中不允许数组的下标值为变量,只能是常量或者常量表达式,必须先定义后使用.数组赋初值几种常见方式: int a[] = {1,2,3,4,5}: int a[4] = {2,1,3,4} ...

  4. [BZOJ1604][Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 (Treap+单调队列)

    题面 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个"群".每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi( ...

  5. CVE-2014-4014 Linux Kernel Local Privilege Escalation PoC

    /**  * CVE-2014-4014 Linux Kernel Local Privilege Escalation PoC  *  * Vitaly Nikolenko  * http://ha ...

  6. python学习第十五天集合的创建和基本操作方法

    集合是python独有的数据列表,集合可以做数据分析,集合是一个无序的,唯一的的数据类型,可以确定列表的唯一性,说一下集合的创建和基本常见操作方法 1,集合的创建 s={1,2,4} 也可以用set( ...

  7. linux的各种安装配置和编译首页

    VMware与Centos系统安装 https://www.cnblogs.com/LLBFWH/articles/10991478.html centos7安装python3 以及tab补全功能 h ...

  8. 理解Throughput和Latency

    Throughput,中文译作吞吐量.Latency,中文译作延迟.它们是衡量软件系统的最常见的两个指标. 吞吐量一般指相当一段时间内测量出来的系统单位时间处理的任务数或事务数(TPS).注意“相当一 ...

  9. JS-02 一元运算符理解

    <script> var i=1; j=i++ + i++; console.log(j); //结果是3 console.log(i); //结果是3 </script> 代 ...

  10. elasticsearch 基础 —— Field Collapsing字段折叠

    允许根据字段值折叠搜索结果.通过按折叠键选择顶部排序文档来完成折叠.例如,下面的查询检索每个用户的最佳推文,并按喜欢的数量对它们进行排序. GET /twitter/_search { "q ...