总结线程池

目录

目标

前言

线程池的参数介绍

线程池参数

什么是工厂模式?

为什么要使用工厂模式?

线程池的工作流程

使用Executors创建常见的线程池

[1. 固定大小线程池](#1. 固定大小线程池)

[2. 缓存线程池](#2. 缓存线程池)

[3. 单线程池](#3. 单线程池)

[4. 定时任务线程池](#4. 定时任务线程池)


目标

  1. 线程池的参数介绍
  2. 线程池的工作流程
  3. 使用Executors 创建常见的线程池

前言

在多线程编程中,线程池是一种重要的资源管理和任务调度机制。它可以有效地管理大量的线程,提高程序的性能和稳定性。本文将总结Java线程池的参数、工作流程,并介绍使用Executors类创建常见线程池的方法。


线程池的参数介绍

线程池参数

  1. 核心线程数:线程池中保持的最小线程数,即使它们处于空闲状态也会保留在池中。当有新的任务提交时,线程池会优先创建核心线程来处理任务。(可以理解为一个公式的正式员工)

  2. 最大线程数:线程池中允许的最大线程数。当队列满了且核心线程都在忙时,线程池会创建新的线程,但不会超过这个最大值。(就是正式员工 + 实习生)

3.线程空闲时间:当线程池中的线程数大于核心线程数时,多余的空闲线程在被回收前等待新任务的最长时间。

  1. 工作队列:用于存储等待执行的任务的队列。当线程池中的线程数达到核心线程数时,新的任务会被放入这个队列中等待执行。

  2. 拒绝策略:当任务无法被接受时的处理策略。常见的策略包括抛出异常、直接执行、丢弃任务或者丢弃队列中最老的任务等。


接下来我们先看一下 java 标准库中线程池的具体实现

在这里,我们创建线程池对象的时候,不是直接 new 一个对象,而是通过专门的方法返回了一个线程池对象!!!

这里后面的部分就涉及到了工厂模式

什么是工厂模式?

使用普通的方法,代替构造方法完成初始化工作。

为什么要使用工厂模式?

通常我们创建一个对象的时候,我们回使用 new 。new 关键字就会触发 类 的构造方法。(存在局限性),所以我们引用了工厂模式。

局限性:

假如有一个类:

很多时候,我们想要实现多个构造函数,但是只能通过重载 的方式(要求参数类型/个数不同)。在这里我们就没办法实现我们想要的结果。所以我们就设计工厂模式。实践中,一般单独搞一个类,由静态方法负责构造对象。


线程池的工作流程

  1. 当有新的任务提交时,线程池会首先判断核心线程数是否已满。如果没有满,会创建新的核心线程来执行任务。

  2. 如果核心线程数已满,任务会被放入工作队列中等待执行。

  3. 如果工作队列已满,线程池会判断当前线程数是否达到最大线程数。如果没有达到,会创建新的线程来执行任务。

  4. 如果线程数已经达到最大线程数且队列已满,根据设定的拒绝策略来处理无法执行的任务。

  5. 当线程池中的线程空闲时间超过设定的时间时,多余的线程会被回收,直到线程数回到核心线程数为止。


使用Executors创建常见的线程池

1. 固定大小线程池

java 复制代码
int poolSize = 5;
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(poolSize);

2. 缓存线程池

java 复制代码
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

3. 单线程池

java 复制代码
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();

4. 定时任务线程池

java 复制代码
ExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(poolSize);

定时任务线程池用于执行定时任务和周期性任务。它可以根据需要调度任务,在指定的延迟之后执行任务,或者定期执行任务。

以上就是Java线程池的基本概念、工作流程以及使用Executors创建常见线程池的方法。合理使用线程池能够提高程序的效率,避免资源浪费,是多线程编程中的重要技术手段。

相关推荐
云和数据.ChenGuang9 分钟前
光哥说Python 循环导入(Circular Import)深度解析:成因、排查与解决方案
开发语言·前端·人工智能·python·langchain
星夜离尘5612 分钟前
MATLAB 工程实验:滞回加持续时间报警,把 UNKNOWN 留在状态机里
开发语言·matlab
avi911113 分钟前
【AI教人】在Inspector显示所有Delegate-Odin Inspector之三
java·前端·算法·delegate·inspector·editor扩展·unity editor
fengci.25 分钟前
BUUCTF(困难部分)
android·开发语言·前端·学习·php
Highcharts.js28 分钟前
BI可视化图表“维护难”问题的解决方案
开发语言·前端·javascript·编辑器·ecmascript·bi·highcharts
青春不朽51238 分钟前
Python 的 list append 为什么是均摊 O(1)?拆开过度分配那张表,看容量翻倍背后的暗账
java·python·list
yixun_gdas1 小时前
政企网站错敏巡查:错敏都藏在哪些位置?
开发语言·前端·javascript·内容运营
小羊没烦恼!1 小时前
.NET 11 Runtime Async 详解
java·运维·开发语言·javascript·python
Дерек的学习记录1 小时前
Unreal Engine 5:开关门实现和流程控制
开发语言·学习·ue5
哇嘎呀1 小时前
RHCSA题目
java·服务器·前端