博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java线程池使用时需要注意的几点
阅读量:6909 次
发布时间:2019-06-27

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

  hot3.png

线程池作用

  • CPU资源隔离
  • 减少上下文切换
  • 减少线程创建/关闭的资源开销
  • 更好并发控制
  • 更好生命周期控制

设计时注意事项

设计时,需注意:

  • 任务混杂
  • 任务依赖
  • 饥饿死锁
  • 慢操作

使用时注意事项

线程池参数

  • 核心池大小(core pool size)
  • 最大池的大小(maximum pool size)
    • 核心池满
    • 队列满
  • 存活时间(keep-alive time)

任务队列(BlockingQueue)

  • 无限队列
    • LinkedBlockingQueue
      • newSingleThreadExecutor
      • newFixedThreadPool
  • 有限队列
    • ArrayBlockingQueue
    • LinkedBlockingQueue(int capacity)
    • 饱和策略
      • setRejectedExecutionHandler
      • ThreadPoolExecutor.AbortPolicy
        • 中止策略(默认)
        • 抛出RejectedExecutionException
        • 调用者捕获后,自行实现逻辑
      • ThreadPoolExecutor.CallerRunsPolicy
        • 不丢弃任务
        • 不抛出异常
        • 把任务退回调用者线程执行(同步调用)
      • ThreadPoolExecutor.DiscardOldestPolicy
        • 遗弃最旧的任务
        • 选择本应该接下来就要执行的任务
          • 会尝试再次提交
        • 如果使用优先级队列,则丢弃优先级最高的元素
        • 配合SynchronousQueue使用,可以实现任务提交并等待的效果
      • ThreadPoolExecutor.DiscardPolicy
        • 遗弃策略
        • 放弃这个任务
      • 可以结合Semaphore使用
        • 限制任务注入率(injection rate)
    • FIFO
  • 同步移交(synchronous handoff)
    • 直接传递给其他线程
    • SynchronousQueue
      • newCachedThreadPool

线程工厂

  • 设置异常处理
    • UncaughtExceptionHandler
  • 设置线程名称
  • 优先级(不建议)
  • 守护线程(不建议)
  • 增加额外的计数器
  • 增加额外的统计信息
  • Executors.privilegedThreadFactory()
    • 使用创建线程的安全策略,ClassLoader

不可再配置

  • 防止ExecutorService被外部调用setting方法,从而修改了线程池配置
  • Executors.unconfigurableExecutorService()

线程池扩展点

  • ThreadPoolExecutor
    • beforeExecutor
    • afterExecutor
    • terminate

执行策略

  • 执行任务,不关心结果
    • void execute(Runnable command)
  • 执行任务,需要对结果进行处理
    • Future submit(Callable task)
    • Future submit(Runnable task)
    • Future submit(Runnable task, T result)
  • 执行一批任务,需要全部成功完成
    • List<Future> invokeAll(Collection<? extends Callable<T>> tasks)
    • List<Future> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
  • 执行一批任务,只需要有一个成功完成即可
    • T List<Future> invokeAny(Collection<? extends Callable<T>> tasks)
    • T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
  • 执行一批任务,需要逐个处理结果
    • CompletionService
      • ExecutorCompletionService

转载于:https://my.oschina.net/roccn/blog/1621326

你可能感兴趣的文章
【PM&数据】如何正确地利用产品数据【上】
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
安装DNS服务器
查看>>
DPM2012学习(一),安装DPM2012
查看>>
设计模式--装饰者理解
查看>>
文件迁移:将/home迁移到一个独立分区中
查看>>
网站seo如何利用指令查询网站收录
查看>>
Python语音识别终极指北,没错,就是指北!
查看>>
python脚本按表备份MySQL数据库
查看>>
【shell】Linux shell 之 打印99乘法表详解
查看>>
lvs 笔记
查看>>
实用技巧:在Linux下设置xhost方法步骤
查看>>
nio Selector 阻塞 唤醒 原理
查看>>
左旋转字符串
查看>>
整理linux平台下的vim插件配置,减少到11M,简化安装
查看>>
解决CentOS 7.0 VMware虚拟机没有网卡,配置网卡信息
查看>>
PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [5] 版本设计分析及数据表设计...
查看>>
全局NSTimer导致的内存泄露及解决办法
查看>>
获取认证用户的相关信息 spring MVC的security模块
查看>>