zoukankan      html  css  js  c++  java
  • 线程池原理总结

    线程是一种稀缺资源,他的创建和销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,其线程的创建需要进行操作系统状态的切换,为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配、调优和监控。

    什么时候使用线程:

      (1)单个任务处理时间比较短;

      (2)需要处理的任务数量很大

    线程池的优势

      (1)重用存在的线程,减少线程创建,消亡的开销,提高性能

      (2)提高响应速度,当任务到达时,任务可以不需要的等到线程创建就能立即执行

      (3)提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一分配、调优和监控。

    线程池执行顺序:

    线程池中包括:核心线程、非核心线程、任务队列、拒绝策略
    • 核心线程池:线程池创建的线程,一般不会超时,如果当前没有任务,核心线程池会一直等待任务被提交进来
    • 非核心线程:核心线程池满了之后,会创建非核心线程
    • 任务队列:容纳等待任务的容器
    • 拒绝策略:非核心线程满了之后,就会触发拒绝策略,拒绝任务进入任务队列
    线程池执行流程:
    1. 通过execute方法提交任务;
    2. 如果线程池没有满,将提交的任务绑定线程池里的核心线程(first task);
    3. 如果线程池满了,会把任务放到任务队列里
    4. 如果队列也满了,创建非核心线程
    5. 如果非核心线程满了之后,产生拒绝策略(可以自定义,如:1.抛出异常,任务已满;2.扩充队列;)

    创建线程池的方式: 

    1. ThreadPoolExcutor方法创建,是最原始的创建方法,其参数有:核心线程数、最大线程数、空闲线程等待时间、等待时间单位、任务等待队列、创建线程工厂、拒绝策略
    2. newFixThreadPool方法创建,该方法时对ThreadPoolExcuse的封装,传入一个corePoolNum核心线程数,保证随时有这个数量的线程在活跃
    3. newCachedThreadPool方法创建,该方法创建的线程是尽可能使用缓存线程处理任务,如果缓存线程不够,则进行new Thread,适合处理大量段时间任务的业务场景,缓存线程超过60s空置,就会终止并移除缓存
    4. newSingleThreadExcutor方法创建,该方法创建的线程池只有一个线程运行,而且对ThreadPoolExcuse进行了重新封装,保证了该线程池不能被修改,只能有一个线程在执行
    5. newSingleThreadScheduledExcutor方法时在newSingleThreadExcutor基础上进行封装的,也是单例线程池,可以进行单例线程池的周期性或定时使用
    6. newScheduledThreadPool方法创建的线程池,和5比起来,这个是多个线程的,也就是说可以对多个线程进行周期性或者定时的调度
    7. newWokrStealingPool方法,是基于ForkJoinPool创建线程的封装,是在jdk1.8后引入的,特点是可以让cpu很好的进行任务并行调度处理,不保证处理顺序,适合长时间处理的业务场景
    当你发现自己的才华撑不起野心时,就请安静下来学习吧
  • 相关阅读:
    控制语句
    (小程序)接收用户键盘输入
    运算符
    java doc形成注释文档
    linux中rz、sz命令,zip、unzip命令,sqlite3基本操作
    hash应用-加随机盐保存密码
    非对称/对称加密算法,hash算法
    自签名的应用--数字货币
    HTTPS原理
    Django中app的model相互引用问题
  • 原文地址:https://www.cnblogs.com/smallVampire/p/12123314.html
Copyright © 2011-2022 走看看