网站主页面设计哪个好,网站建设的提升,网站建设手稿,软件开发联系电话其他系列文章目录 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 系列文章目录 前言 一、为什么需要线程池#xff1f; 二、举个背景例子 三、怎么创建线程池#xff1f; 四、线程池指定线程数 前言
学习线程池能够帮助我们更好地处理多线程编程#xff0c;并提高程… 其他系列文章目录 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 系列文章目录 前言 一、为什么需要线程池 二、举个背景例子 三、怎么创建线程池 四、线程池指定线程数 前言
学习线程池能够帮助我们更好地处理多线程编程并提高程序的性能和稳定性。 一、为什么需要线程池
JVM在HotSpot的线程模型下Java线程会一对一映射为内核线程。 这意味着在Java中每次创建以及回收线程都会去内核创建以及回收。 这就有可能导致: 创建和销毁线程所花费的时间和资源可能比处理的任务花费的时间和资源要更多。 线程池的出现是为了提高线程的复用性以及固定线程的数量 二、举个背景例子 一个消息管理平台提供其中一个功能就是: 运营会圈定人群然后群发消息。 主要流程大致就是:创建模板----定时----群发消息----用户收到消息。 先说一个概念HDFS (Hadoop Distributed File System) 是分布式文件系统的一种用于存储和处理大数据集。它是Hadoop框架的核心组件之一。HDFS可以让用户将大数据集分散在多台计算机上以提高数据处理能力和可靠性。它将数据拆分为小块并存储在多台计算机上提供了读写分离、容错机制、数据备份和高可用等特性。HDFS的基本单位是数据块通常为128MB或256MB。数据块的复制数量和位置由系统自动管理。HDFS对于大数据的存储和管理提供了高度的可靠性和可扩展性因此被广泛应用于大数据处理和分析领域。 然后运营圈定的人群实际上在模板上只是一个ID、这边要通过ID去获取到HDFS文件 对HDFS文件进行遍历然后继续往下发接收到定时任务再对HDFS进行遍历这里的处理用的就是线程池处理。
HDFS遍历其实就是IO的操作把这个过程给异步化为了提高系统的吞吐量于是这里用的线程池。即便遍历HDFS出现问题我们可以建设完备的监控和告警可以及时发现。 三、怎么创建线程池
阿里巴巴开发手册就有提到不要使用Executors去创建线程。建议使用ThreadPoolExecutor去创建线程池。
最主要的目的就是:使用ThreadPoolExecutor创建的线程你是更能了解线程池运行的规则避免资源耗尽的风险。
七个核心参数 corePoolSize核心线程数线程池维护的最少线程数。 maximumPoolSize最大线程数线程池维护的最大线程数。 keepAliveTime线程空闲时间当线程池中的线程数大于核心线程数时这些多余的线程会被销毁这个参数定义了这些线程的空闲时间。 TimeUnit时间单位keepAliveTime的时间单位。 workQueue任务队列当提交的任务数量大于线程池当前可用的线程数时任务会被存放在这个队列中。 threadFactory线程工厂用于创建线程池中的线程。 handler拒绝策略当任务队列已满且线程池中的线程数量已达到最大值时新提交的任务如何被拒绝执行。常用的拒绝策略有AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy和DiscardPolicy。
任务提交流程
首先会判断运行线程数是否小于coreFoolSize如果小于则直接创建新的线程执行任务。如果大于corePoolSize判断workQueue阻塞队列是否已满如果还没满则将任务放到阻塞队列中。如果workQueue阻塞队列已经满了则判断当前线程数是否大于maximumPoolSize如果没大于则创建新的线程执行任务。如果大于maximumPoolSize则执行任务拒绝策略 (具体就是你自己实现的handler)。
这里有个点需要注意下就是workQueue阻塞队列满了但当前线程数小于maximumPoolSize这时候会创建新的线程执行任务。
不过一般我们都是将corePoolSize和maximumPoolSize设置相同数量。 keepAliveTime指的就是当前运行的线程数大于核心线程数了只要空闲时间达到了就会对线程进行回收。 四、线程池指定线程数
线程池指定线程数这块首先要考量自己的业务是什么样的
是cpu密集型的还是io密集型的,假设运行应用的机器CPU核心数是N。 cpu密集型的可以先给到N1io密集型的可以给到2N 。 上面这个只是一个常见的经验做法具体究竟开多少线程需要压测才能比较准确地定下来。 注线程不是说越大越好在之前的我也提到过多线程是为了充分利用CPU的资源。如果设置的线程过多线程大量有上下文切换这一部分也会带来系统的开销这就得不偿失了。