博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程池技术
阅读量:4543 次
发布时间:2019-06-08

本文共 1537 字,大约阅读时间需要 5 分钟。

  • 在服务器负载过大,如何让新的线程等待或者友好的拒绝服务?
    • 简单方式使用线程池
    • 开源技术guava、hystrix
  • 线程池的基本作用
    • 利用线程池管理并复用线程、控制最大并发数
    • 实现任务线程队列缓存策略和拒绝机制
    • 实现某些与时间相关的功能
      • 定时执行
      • 周期执行
    • 隔离线程环境
      • 比如交易服务和搜索服务在同一台服务器上
  • ThreadPoolExecutor核心参数
    • corePoolSize
      • 常驻核心线程数
      • 等于0,任务执行完即销毁
      • 大于0,任务执行完,核心线程也不会被销毁
    • maximumPoolSize
      • 线程池能容纳同时执行的最大线程数
      • 如果待执行的线程数大于此值,需要借助workQueue缓存在队列中。
    • keepAliveTime
      • 线程池中的线程空闲时间
      • 空闲线程达到这个值时,线程会被销毁,直到只剩下corePoolSize个线程为止
      • 避免浪费内存和句柄资源
    • TimeUnit
      • 时间单位
      • keepAliveTime时间单位通常时秒
    • workQueue
      • 缓存队列
      • 请求线程数大于maximumPoolSize时,线程进入BlockingQueue阻塞队列。是一个生产消费模型队列。
    • threadFactory
      • 线程工厂,用来生产一组相同任务的线程
    • handler
      • 执行拒绝策略的对象
      • 当超过workQueue的任务缓存区上限后,就可以通过该策略处理请求,这是一种简单的限流保护。
      • 三种友好的拒绝策略
        • 保存到数据库进行削峰填谷,空闲时再提取出来
        • 转向某个提示页面
        • 打印日志
  • Executors的5个核心方法
    • newSingleThreadPool
      • 保证按任务的提交顺序依次执行
      • 无界队列,瞬时请求非常大,会有OOM风险
      • 返回ThreadPoolExecutor线程池对象
    • newFixedThreadPool
      • 核心线程数也是最大可执行线程数
      • 不存在空闲线程
      • keepAliveTime等于0
      • 无界队列,瞬时请求非常大,会有OOM风险
      • 返回ThreadPoolExecutor线程池对象
    • newCachedThreadPool
      • maximumPoolSize最大可以至Integer.MAX_VALUE,如果达到这个上限,没有任何服务器能够正常工作,存在OOM风险。
      • 回收工作线程
      • 返回ThreadPoolExecutor线程池对象
    • newScheduledThreadPool
      • 线程数最大可以至Integer.MAX_VALUE,存在OOM风险
      • 不回收工作线程
      • 返回ScheduledThreadPoolExecutor线程池对象
    • newStealingThreadPool
      • JDK8引入的新线程池对象
      • 支持给定的并行度,默认CPU数量
      • 使用多个队列减少竞争
      • 返回ForkJoinPool线程池对象
  • 自定义实现ThreadFactory
    • 一定要有特定意义的名称,方便问题回溯
      • 如调用来源、线程的业务含义
    • 统一用newThread获取线程
      • 保存名称前缀+AtomicInteger
  • 自定义实现RejectedExecutionHandler
    • 打印当前线程池的状态
  • 使用线程池注意事项
    • 合理设置线程池参数,根据实际业务场景来决定工作线程数
    • 线程资源必须通过线程池提供,不允许在应用中自行显示创建线程
      • 不允许使用Executors
      • 推荐直接使用ThreadPoolExecutor的方式创建,这样能更加明确线程池的运行规则,避免资源耗尽。
    • 创建线程或线程池要指定有意义的名字,方便问题回溯
posted on
2019-01-19 13:37  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/bee4j/p/10291476.html

你可能感兴趣的文章
poj2728 最优比率生成树
查看>>
Android开发 打开已存在的项目(以虹软人脸识别sdk的demo为例)
查看>>
身份证号码最后一位校检码的计算公式
查看>>
使用 iTextSharp 生成 PDF 表格
查看>>
sql 查出一张表中重复的所有记录数据
查看>>
IIS 上传大文件 30MB 设置限制了上传大小
查看>>
vue2.0结合Element实现select动态控制input禁用
查看>>
【Codeforces Round #455 (Div. 2) A】Generate Login
查看>>
【Codeforces 476C】Dreamoon and Sums
查看>>
【codeforces 505C】Mr.Kitayuta,the Treasure Hunter
查看>>
混合应用 微信登录授权 微信登录认证失败 ios PGWXAPI错误-1 code:-100 / 安卓 message:invalid appsecret innerCode:40125...
查看>>
MSSQL按分页前去盘查了局的存储进程
查看>>
运用centosplus来更新你的CentOS
查看>>
wxDownload Fast 0.4.5
查看>>
<实训|第十天>从底层解释一下U盘内存为什么变小的原因附数据恢复的基本原理...
查看>>
测试Windows Live Writer插件
查看>>
常用正则封装,积少成多
查看>>
文件下载工具类
查看>>
Python 定义自己的常量类
查看>>
C++读取文本文件
查看>>