Java 语言线程池的原理结构

embedded/2025/2/22 21:16:37/

在 Java 中,线程池是一种用于管理线程的机制,它可以有效地复用线程,减少线程创建和销毁带来的开销,提高系统的性能和稳定性。下面详细介绍 Java 语言线程池的原理结构。

核心类和接口

Java 线程池的核心类和接口主要位于 java.util.concurrent 包中,主要涉及以下几个关键类和接口:

  • Executor 接口:是线程池的基础接口,它定义了一个执行任务的方法 execute(Runnable command),用于将任务提交给线程池执行。
  • ExecutorService 接口:继承自 Executor 接口,扩展了一些管理线程池生命周期和提交任务的方法,如 submitshutdownshutdownNow 等。
  • AbstractExecutorService:实现了 ExecutorService 接口的大部分方法,为具体的线程池实现类提供了基础。
  • ThreadPoolExecutor:是 Java 线程池的核心实现类,它继承自 AbstractExecutorService 类,通过配置不同的参数可以创建不同类型的线程池。
  • ScheduledExecutorService 接口:继承自 ExecutorService 接口,用于支持定时任务和周期性任务的执行。
  • ScheduledThreadPoolExecutor:继承自 ThreadPoolExecutor 类,实现了 ScheduledExecutorService 接口,用于执行定时任务和周期性任务。

线程池的原理结构

线程池的主要组成部分

一个线程池主要由以下几个部分组成:

  • 线程池管理器:负责创建、管理和销毁线程池,它接收用户提交的任务,并根据线程池的状态和配置决定如何处理这些任务。
  • 工作线程:是线程池中的实际执行任务的线程,它们从任务队列中获取任务并执行。
  • 任务队列:用于存储用户提交的任务,当线程池中的工作线程都在忙碌时,新提交的任务会被放入任务队列中等待执行。
  • 任务拒绝策略:当任务队列已满且线程池中的线程数量达到最大线程数时,新提交的任务会被拒绝,此时需要使用任务拒绝策略来处理这些被拒绝的任务。
线程池的工作流程

线程池的工作流程可以分为以下几个步骤:

  1. 提交任务:用户通过调用线程池的 executesubmit 方法将任务提交给线程池。
  2. 线程池判断:线程池接收到任务后,会根据当前线程池的状态和配置进行判断:
    • 如果当前线程池中的线程数量小于核心线程数(corePoolSize),则创建一个新的工作线程来执行该任务。
    • 如果当前线程池中的线程数量大于等于核心线程数,则将任务放入任务队列中。
    • 如果任务队列已满且线程池中的线程数量小于最大线程数(maximumPoolSize),则创建一个新的工作线程来执行该任务。
    • 如果任务队列已满且线程池中的线程数量大于等于最大线程数,则根据任务拒绝策略来处理该任务。
  3. 执行任务:工作线程从任务队列中获取任务并执行,执行完任务后,工作线程会继续从任务队列中获取新的任务,直到任务队列为空。
  4. 线程回收:如果线程池中的线程空闲时间超过了指定的空闲时间(keepAliveTime),且线程数量大于核心线程数,则该线程会被回收。

示例代码

下面是一个使用 ThreadPoolExecutor 创建线程池的示例代码:

java">import java.util.concurrent.*;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // 核心线程数5, // 最大线程数60, // 线程空闲时间TimeUnit.SECONDS, // 时间单位new LinkedBlockingQueue<>(10) // 任务队列);// 提交任务for (int i = 0; i < 20; i++) {final int taskId = i;executor.execute(() -> {System.out.println("Task " + taskId + " is being executed by " + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});}// 关闭线程池executor.shutdown();}
}

代码解释

  • 在上述代码中,我们创建了一个 ThreadPoolExecutor 线程池,核心线程数为 2,最大线程数为 5,线程空闲时间为 60 秒,任务队列为 LinkedBlockingQueue,容量为 10。
  • 然后,我们向线程池提交了 20 个任务,每个任务会打印出自己的任务 ID 和执行线程的名称,并休眠 1 秒钟。
  • 最后,我们调用 shutdown 方法关闭线程池。

通过上述的原理结构和示例代码,可以更好地理解 Java 语言线程池的工作机制。


http://www.ppmy.cn/embedded/164092.html

相关文章

ios UICollectionView使用

UICollectionView列表视图和UITableView用法类似&#xff0c;直接给出代码 // // myUICollectionViewTestController.m // iosstudy2024 // // Created by figo on 2025/1/21. //#import "UICollectionViewTestController.h"interface UICollectionViewTestContr…

阿里云虚机的远程桌面登录提示帐户被锁定了

提示由于安全原因&#xff0c;帐户被锁定。 阿里云虚机ECS的远程桌面登录提示帐户被锁定了&#xff0c;只能登录阿里云处理 阿里云-计算&#xff0c;为了无法计算的价值 需选择通过VNC连接 然后计算机管理&#xff0c;解除帐户锁定即可。

DeepSeek R1生成图片总结2(虽然本身是不能直接生成图片,但是可以想办法利用别的工具一起实现)

DeepSeek官网 目前阶段&#xff0c;DeepSeek R1是不能直接生成图片的&#xff0c;但可以通过优化文本后转换为SVG或HTML代码&#xff0c;再保存为图片。另外&#xff0c;Janus-Pro是DeepSeek的多模态模型&#xff0c;支持文生图&#xff0c;但需要本地部署或者使用第三方工具。…

phpmyadmin 文件包含(CVE-2014-8959)

目录 漏洞描述 1.攻击机配置go环境&#xff1a; 2.点击“数据库”抓包token值 3.拿到flag&#xff1a; 漏洞描述 phpMyAdmin是一套开源的、基于Web的MySQL数据库管理工具。其index.php中存在一处文件包含逻辑&#xff0c;通过二次编码即可绕过检查&#xff0c;造成远程文件…

css里flex+margin布局

css里flexmargin布局 居中两端排列依次排列 在flexmargin的布局中&#xff0c;margin设置auto会自动将元素剩余的空间用margin填满 居中 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>居中</tit…

【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑰】

ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase17 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月19日 关键词&#xff1a;UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-017测试用例 用例ID测试场景验证要点参考条款预期结果TC…

网络安全入门攻击与防御实战(四)

漏洞利用&#xff1a;永恒之蓝&#xff08;MS17-010&#xff09;与同类漏洞解析 1 永恒之蓝&#xff08;MS17-010&#xff09;漏洞背景 &#xff08;1&#xff09;漏洞信息 CVE编号&#xff1a;CVE-2017-0143 ~ CVE-2017-0148 影响范围&#xff1a;Windows XP ~ Windows 201…

探索飞鹤奶粉奥秘,领会科技魅力

在科技迅猛发展的当下&#xff0c;AI 技术正深刻重塑各行业格局。乳制品行业亦不例外。近日&#xff0c;长江商学院「AI 未来空间站」的同学们深入走访了飞鹤集团&#xff0c;探寻其在数字化浪潮中的创新实践与卓越成就。 在飞鹤的智能化生产车间&#xff0c;同学们目睹了高度自…