热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

为什么80%的码农都做不了架构师?线程池作用CPU资源隔离减少上下文切换减少线程创建关闭的资源开销更好并发控制更好生命周期控制设计时注意事项设计时,

为什么80%的码农都做不了架构师?>>>   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 invokeAll(Collection> tasks)
    • List invokeAll(Collection> tasks, long timeout, TimeUnit unit)
  • 执行一批任务,只需要有一个成功完成即可
    • T List invokeAny(Collection> tasks)
    • T invokeAny(Collection> tasks, long timeout, TimeUnit unit)
  • 执行一批任务,需要逐个处理结果
    • CompletionService
      • ExecutorCompletionService

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



推荐阅读
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
author-avatar
55525wio
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有