当前位置: 首页 > news >正文

Java线程池详细解释

Java线程池是一种管理和重用线程的机制,它可以帮助提高多线程应用程序的性能和稳定性。线程池在程序启动时创建一组线程,并根据需要重用这些线程,而不是每次需要执行任务时都创建新线程。这可以减少线程创建和销毁的开销,提高程序的响应速度。

Java线程池通常由java.util.concurrent包中的ThreadPoolExecutor类实现。线程池包含以下主要组件:

  1. 核心线程池大小(Core Pool Size): 线程池中保持的最小线程数。即使线程处于空闲状态,核心线程也不会被销毁,除非设置了allowCoreThreadTimeOuttrue

  2. 最大线程池大小(Maximum Pool Size): 线程池中允许的最大线程数。当任务队列已满且当前线程数小于最大线程数时,线程池会创建新线程来处理任务。

  3. 任务队列(Work Queue): 用于存储等待执行的任务的队列。当线程池中的线程数达到核心线程数时,新任务会被放入任务队列中等待执行。

  4. 线程工厂(Thread Factory): 用于创建新线程的工厂。

  5. 拒绝策略(Rejected Execution Handler): 当线程池已经达到最大线程数并且任务队列已满时,决定如何处理新任务的策略。常见的拒绝策略包括抛出异常、丢弃任务、丢弃最旧的任务等。

线程池的工作流程通常如下:

  1. 当有新任务提交时,线程池首先检查是否有空闲线程可以执行该任务。
  2. 如果有空闲线程,则将任务分配给空闲线程执行。
  3. 如果没有空闲线程且当前线程数小于最大线程数,则创建新线程执行任务。
  4. 如果没有空闲线程且当前线程数已达到最大线程数,则根据拒绝策略决定如何处理新任务。

通过合理设置线程池的参数,可以有效地控制线程的数量,避免资源耗尽和系统崩溃。常见的线程池类型包括FixedThreadPoolCachedThreadPoolScheduledThreadPool等,每种类型都适用于不同的场景和需求。

代码解释

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个固定大小的线程池,包含5个线程ExecutorService executor = Executors.newFixedThreadPool(5);// 向线程池提交10个任务for (int i = 0; i < 10; i++) {// 创建一个任务Runnable task = new Task(i);// 提交任务给线程池执行executor.execute(task);}// 关闭线程池executor.shutdown();}
}class Task implements Runnable {private int taskId;public Task(int id) {this.taskId = id;}@Overridepublic void run() {System.out.println("Task " + taskId + " is running on thread: " + Thread.currentThread().getName());}
}

现在让我逐步解释代码:

  1. import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;:导入Java并发包中与线程池相关的类。

  2. public class ThreadPoolExample { ... }:定义了一个名为 ThreadPoolExample 的Java类。

  3. public static void main(String[] args) { ... }:主方法,程序从这里开始执行。

  4. ExecutorService executor = Executors.newFixedThreadPool(5);:创建一个固定大小的线程池,其中包含5个线程。Executors.newFixedThreadPool() 方法返回一个 ExecutorService 对象,该对象代表了一个固定大小的线程池。

  5. for (int i = 0; i < 10; i++) { ... }:循环提交10个任务给线程池执行。

  6. Runnable task = new Task(i);:创建一个实现了 Runnable 接口的任务对象。在这个示例中,任务简单地打印自己的ID。

  7. executor.execute(task);:将任务提交给线程池执行。线程池会从池中的线程中选择一个来执行该任务。

  8. executor.shutdown();:关闭线程池。这会导致线程池停止接受新任务,并尝试完成所有已提交但尚未开始执行的任务。

  9. class Task implements Runnable { ... }:定义了一个实现了 Runnable 接口的任务类。该任务类包含一个任务ID,并实现了 run() 方法来执行任务的具体逻辑。

  10. public void run() { ... }:在 Task 类中覆盖了 Runnable 接口的 run() 方法。在这个方法中,任务打印自己的ID和执行线程的名称。

这就是一个简单的Java线程池示例代码。通过使用线程池,我们可以高效地管理和重用线程,从而提高程序的性能和稳定性。

相关文章:

  • 软考中级(网络工程师考核要点)第一章 计算机网络系统(信道特性应用)第六期(4B/5B编码、数字调制技术和脉冲编码调制)
  • 通俗易懂:MySQL中如何用SQL语句模拟栈或队列的操作?
  • 16进制的字符串转byte[]数组 以及将字节数组转换成十六进制的字符串
  • Linux实战笔记(六) SSH
  • 如何根据黄金行情进行交易操作?
  • 信息安全技术基础知识总结
  • java ssh 电影院购票管理系统eclipse开发mysql数据库MVC模式java编程网页设计
  • 互联网轻量级框架整合之JavaEE基础II
  • 设计模式学习笔记 - 设计模式与范式 -结构型:4.适配器模式
  • 力扣刷题Days30-238. 除自身以外数组的乘积(js)
  • 软考中级(网络工程师考核要点)第一章 计算机网络系统(信道特性应用)第五期(曼彻斯特和差分曼彻斯特)重点考
  • 浅析MNN
  • Linux权限提升总结
  • 《新机器智能》的深度解读与感悟
  • Python版【植物大战僵尸 +源码】
  • 【Leetcode】101. 对称二叉树
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【EOS】Cleos基础
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Flannel解读
  • JAVA并发编程--1.基础概念
  • js数组之filter
  • Laravel 实践之路: 数据库迁移与数据填充
  • mac修复ab及siege安装
  • 解析带emoji和链接的聊天系统消息
  • 入门到放弃node系列之Hello Word篇
  • 入门级的git使用指北
  • 一份游戏开发学习路线
  • 自定义函数
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (day 12)JavaScript学习笔记(数组3)
  • (初研) Sentence-embedding fine-tune notebook
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (六)vue-router+UI组件库
  • (四)c52学习之旅-流水LED灯
  • (算法二)滑动窗口
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)jQuery 基础
  • (转)setTimeout 和 setInterval 的区别
  • (转)母版页和相对路径
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .Net Core 中间件验签
  • .net(C#)中String.Format如何使用
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET是什么
  • /run/containerd/containerd.sock connect: connection refused
  • @Documented注解的作用
  • [20190416]完善shared latch测试脚本2.txt