文档章节

Java线程池使用时需要注意的几点

秋雨霏霏
 秋雨霏霏
发布于 02/11 16:34
字数 555
阅读 197
收藏 9
点赞 0
评论 0

线程池作用

  • 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

© 著作权归作者所有

共有 人打赏支持
秋雨霏霏
粉丝 143
博文 91
码字总数 160569
作品 0
杭州
CTO(技术副总裁)
JVM(Thread/Stack)

JVM Thread/Stack Memory Size JVM Thread/Stack Object states (6 states) Dump OS Thread/Stack OS的线程运行状态 Iuput(top): Output: or input(ps): Dump Thread/Stack Analysis 注意thr......

赵-猛
2016/10/12
0
0
Java多线程学习(二)synchronized关键字(2)

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
04/16
0
0
JVM 运行时数据区简介及堆与栈的区别

理解JVM运行时的数据区是Java编程中的进阶部分。我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机制,...

大数据之路
2015/08/02
0
1
《深入理解Java虚拟机》之Java虚拟机内存结构(1)

这个是很重要的一个基础认识。 java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下: 其中方法区和堆是由所有线程共享的数据区。 Java虚拟机栈,本地方法栈和程...

lixiyuan
2014/04/10
0
1
深入Java核心:JVM中的栈和局部变量

Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的。可以看出栈在Java核心的重要位置。今天我们就继续深入Java核心这个系列,为您介绍Java中的...

郭二翔
2011/12/19
0
0
JAVA多线程和并发基础面试问答

Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一...

清风傲剑
2014/12/06
0
0
JAVA多线程和并发基础面试问答

原文链接 译文连接 作者:Pankaj 译者:郑旭东 校对:方腾飞 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢...

雷神雨石
2014/07/19
0
2
JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:...

LCZ777
2014/05/26
0
0
JAVA多线程和并发基础面试问答

Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一...

hanzhankang
2014/01/20
0
0
InheritableThreadLocal详解

1、简介 在上一篇 ThreadLocal详解 中,我们详细介绍了ThreadLocal原理及设计,从源码层面上分析了ThreadLocal。但由于ThreadLocal设计之初就是为了绑定当前线程,如果希望当前线程的ThreadL...

沈渊
04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
9分钟前
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
20分钟前
0
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
30分钟前
0
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
39分钟前
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
48分钟前
0
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
48分钟前
0
0
TensorFlow,从一个 Android Demo 开始

TensorFlow Android Demo 项目地址 Machine Learning 既然提到了 TensorFlow,那是不是得神经网络、机器学习了解下? 如果你能坚持把 机器学习速成课程 给啃完了,觉得还挺有兴趣的,那可以考...

孟飞阳
50分钟前
0
0
JVM学习笔记二:内存结构规范

1、JVM基本结构图 2、java堆(Heap) 3、方法区(Method Area) 4、程序计数器 5、JAVA栈图解 局部变量表:八大基本类型,还可以存储引用类型 上一篇:JVM学习笔记一:类加载机制介绍...

刘祖鹏
55分钟前
0
0
mui集成微信H5支付(返回白屏问题已经解决)

一.项目需求 因为公司人员缺少,没有专门开发安卓和ios的人员,为了项目尽早上线采用了混合APP开发的方式,我选择了MUI混合开发框架,项目中需要在用户购买VIP会员的时候进行支付,所以需要在项目...

银装素裹
59分钟前
1
0
SpringBoot集成Redis--配置自定义的RedisCacheManager

配置自定义的RedisCacheManager--1自定义键生成规则 默认的键生成器 当不指定缓存的key时,SpringBoot会使用SimpleKeyGenerator生成key。 SimpleKeyGenerator SimpleKey 查看源码可以发现,它...

karma123
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部