Java学习--线程池

news2024/11/13 10:22:52

1. 线程池概述

线程池是一种管理线程的机制,通过预先创建一定数量的线程来执行任务,避免频繁地创建和销毁线程,进而提高系统性能,减少资源消耗。线程池在程序启动时创建若干线程,当有任务提交时,线程池分配空闲线程来执行任务。线程池的好处包括减少线程创建的开销、提高响应速度以及限制最大并发数,从而有效控制资源使用。

2. 线程状态介绍

Java 中的线程状态被定义在 java.lang.Thread.State 枚举类中,包含六种状态:

线程状态含义
NEW线程刚被创建,但尚未启动。
RUNNABLE线程已启动,具备执行资格,但正在等待 CPU 分配执行权。
BLOCKED线程尝试获取一个被其他线程占用的锁时进入此状态。
WAITING线程在等待其他线程的特定操作(如 wait()join())。
TIMED_WAITING线程在有限时间内等待特定操作(如 sleep()wait(long))。
TERMINATED线程已完成执行,进入终止状态。

3. 线程池的基本原理

线程池的核心思想是:预先创建多个线程,这些线程在任务到来时执行任务,任务执行完毕后线程返回池中等待下一个任务。线程池的设计思路如下:

  1. 准备一个任务队列。
  2. 一次性启动多个消费者线程。
  3. 消费者线程开始等待任务的到来。
  4. 当任务加入队列时,线程池唤醒一个消费者线程执行任务。
  5. 任务执行完毕后,线程回到线程池中等待下一个任务。

4. 使用 Executors 创建线程池

Java 提供了 Executors 工具类用于创建线程池,常见的线程池类型有:

4.1 newCachedThreadPool()

创建一个默认线程池,线程池中的线程数量动态增长。适合执行短时间内大量请求的场景。

ExecutorService executorService = Executors.newCachedThreadPool();

4.2 newFixedThreadPool(int nThreads)

创建一个固定大小的线程池,适合处理固定数量并发任务的场景。

ExecutorService executorService = Executors.newFixedThreadPool(10);

4.3 newSingleThreadExecutor()

创建一个单线程池,适用于需要顺序执行任务的场景。

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

4.4 newScheduledThreadPool(int nThreads)

创建一个支持定时或周期性任务的线程池。

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

5. 自定义线程池 ThreadPoolExecutor

除了使用 Executors 创建线程池外,我们还可以通过 ThreadPoolExecutor 自定义线程池。

构造方法:

ThreadPoolExecutor pool = new ThreadPoolExecutor(
    核心线程数, 最大线程数, 空闲线程存活时间, 时间单位, 任务队列, 创建线程工厂, 拒绝策略);

示例代码:

ThreadPoolExecutor pool = new ThreadPoolExecutor(
    2, 5, 2, TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(10),
    Executors.defaultThreadFactory(),
    new ThreadPoolExecutor.AbortPolicy());

6. 线程池参数详解

  • corePoolSize:核心线程数,线程池中始终保持存活的线程数量。
  • maximumPoolSize:最大线程数,线程池中能够存在的最大线程数量。
  • keepAliveTime:空闲线程的最大存活时间。
  • unit:时间单位,配合 keepAliveTime 使用。
  • workQueue:任务队列,用于存储等待执行的任务。
  • threadFactory:线程工厂,用于创建线程。
  • handler:任务拒绝策略,当任务队列满时执行的策略。

7. 线程池的任务拒绝策略

线程池提供了四种任务拒绝策略,当线程池和队列已满时执行:

  1. AbortPolicy(默认):直接抛出 RejectedExecutionException 异常,丢弃任务。
  2. DiscardPolicy:直接丢弃任务,不抛出异常。
  3. DiscardOldestPolicy:丢弃队列中等待时间最久的任务,执行当前任务。
  4. CallerRunsPolicy:调用任务的线程执行任务,绕过线程池。

示例代码展示了不同策略的使用和对应的行为。

8. 总结

线程池是多线程编程中的关键工具,合理地使用线程池可以提高程序的并发处理能力,优化资源利用率。Java 提供了 Executors 工具类来方便地创建不同类型的线程池,同时也可以通过 ThreadPoolExecutor 进行自定义,满足更多应用场景需求。掌握线程池的使用对于写出高效的多线程程序非常重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Mac 和 Windows 系统中快速部署 OceanBase

OceanBase 是一款分布式数据库&#xff0c;具备出色的性能和高扩展性&#xff0c;可以为企业用户构建稳定可靠、灵活扩展性能的数据库服务。本文以开发者们普遍熟悉的Windows 或 Mac 环境为例&#xff0c;介绍如何快速上手并体验OceanBase。 一、环境准备 1. 硬件准备 OceanB…

使用Ant Design的Layout布局不能撑满整个屏幕问题解决方法

代码示例&#xff1a; import React, { useState } from react import {LaptopOutlined,NotificationOutlined,UserOutlined, } from ant-design/icons import type { MenuProps } from antd import { Layout, Menu, theme } from antd import routes from ./routes/index imp…

【ubuntu18.04】使用U盘制作ubuntu18.04启动盘操作说明

打开show application 打开Startup Disk 选择镜像 双击选择ubuntu的iso镜像 镜像下载地址 Ubuntu 18.04.6 LTS (Bionic Beaver) 制作镜像 注意&#xff1a; 制作镜像会格式化U盘&#xff0c;记得备份资料 点击Make Startup Disk,弹出如下对话框 点击Yes 输入管理员密码&a…

22.04Ubuntu---ROS2创建python节点

创建工作空间 mkdir -p 02_ros_ws/src 然后cd到该目录 创建功能包 在这条命令里&#xff0c;tom就是你的功能包 ros2 pkg create tom --build-type ament_python --dependencies rclpy 可以看到tom功能包已经被创建成功了。 使用tree命令&#xff0c;得到如下文件结构 此时…

《手写Spring渐进式源码实践》实践笔记(第十七章 数据类型转换)

文章目录 第十七章 数据类型转换工厂设计实现背景技术背景Spring数据转换实现方式类型转换器&#xff08;Converter&#xff09;接口设计实现 业务背景 目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件转换器工厂Bean测试用例测试结果&#xff1a; 总结 第十七章 数…

使用docker形式部署jumpserver

文章目录 前言一、背景二、使用步骤1.基础环境准备2.拉取镜像3.进行部署4.备份记录启动命令 前言 记录一下使用docker形式部署jumpserver服务的 一、背景 搭建一个jumpserver的堡垒机&#xff0c;但是发现之前是二进制文件部署的&#xff0c;会在物理机上部署污染环境&#x…

(62)使用RLS自适应滤波器进行系统辨识的MATLAB仿真

文章目录 前言一、基本概念二、RLS算法原理三、RLS算法的典型应用场景四、MATLAB仿真代码五、仿真结果1.滤波器的输入信号、参考信号、输出信号、误差信号2.对未知系统进行辨识得到的系数 总结与后续 前言 RLS&#xff08;递归最小二乘&#xff09;自适应滤波器是一种用于系统…

算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…

MySQL数据库的备份与还原

目录 mysql 数据库的备份 生成SQL脚本 1 在控制台使用mysqldump命令可以用来生成指定数据库的脚本 ​编辑2 在数据库图形化界面工具&#xff1a;DateGrip 中操作&#xff1a;导出 mysql 数据库的还原 执行SQL脚本 1 在控制台使用 命令&#xff0c;指定将sql脚本导入到指定…

使用 IDEA 创建 Java 项目(二)

IDEA 创建 Java 项目 一般创建 Java 项目可以创建一个空项目&#xff0c;然后在空项目中添加模块&#xff0c;在模块中编写包&#xff0c;包中包含 Java 类。 如果你的 JDK 没有被 IDEA 自动找到的话&#xff0c;可以手动选择 JDK。我们先来学习 Intellij 构建系统下的 Java …

图论算法:最短路径算法详解【c语言版】(无权最短路径、Dijkstra算法)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 图论算法&#xff1a;最短路径算法详解 在图论中&#xff0c;最短路径问题是寻找图中两点之间具有最小总权重的路径。这个问题在许多实际应用中都有重要的作用&#xff0c;比如网络路由、城市交通规…

vue通过iframe方式嵌套grafana图表

文章目录 前言一、iframe方式实现xxx.xxx.com拒绝连接登录不跳转Cookie 的SameSite问题解决不显示额外区域(kiosk1) 前言 我们的前端是vue实现的&#xff0c;监控图表是在grafana中的&#xff0c;需要在项目web页面直接显示grafana图表 一、iframe方式实现 xxx.xxx.com拒绝连…

苹果系统安装Homebrew时CLT缺失的问题

前言 为了使用brew命令&#xff0c;必须安装Homebrew工具。但是在Howebrew安装的时候&#xff0c;会出现CLT&#xff08;Command Line Tools&#xff09;缺失的问题。本博客就是讨论如何来解决这个问题的。 1、问题的出现 2、解决途径 在命令行终端中输入命令&#xff1a;xcod…

LeetCode Hot100 49.字母异位词分组

题干&#xff1a; 思路&#xff1a; 输入的是一个字符串数组&#xff0c;输出是一个列表&#xff0c;首先我们需要通过遍历数组获得每一个字符串&#xff0c;我们想要判断获得的任意两个字符串是不是字母异位词&#xff0c;所以可以将获得的字符串排序&#xff08;转换为字符数…

小白初入Android_studio所遇到的坑以及怎么解决

1. 安装Android_studio 参考&#xff1a;Android Studio 安装配置教程 - Windows(详细版)-CSDN博客 Android Studio超级详细讲解下载、安装配置教程&#xff08;建议收藏&#xff09;_androidstudio-CSDN博客 想下旧版本的android_studio的地址&#xff08;仅供参考&#xf…

游戏引擎中LOD渲染技术

一.LOD(Level Of Detail) 为了降低GPU渲染压力,根据摄像机距离模型距离将面数较高的模型替换为面数较低的模型. LOD LOD0(distance<10) LOD1(distance<20) LOD2(distance<30) 故通常引擎中MetaMesh是由一个或多个LOD模型构成. MetaMesh mesh mesh.lod1 mesh.lod…

论文阅读《Structure-from-Motion Revisited》

摘要 增量式地运动结构恢复是从无序图像集合中进行三维重建的一个普遍策略。虽然增量式地重建系统在各个方面上都取得了巨大的进步&#xff0c;但鲁棒性、准确性、完整度和尺度仍然是构建真正通用管道的关键问题。我们提出了一种新的运动结构恢复技术&#xff0c;它改进了目前…

【人工智能训练师】3 集群搭建

开启集群环境 本次环境为单节点伪集群环境&#xff0c;环境中已经安装JDK1.8、Hadoop2.7.7、Mysql5.7、hive2.3.4。— 1.环境中已经安装/root/software/hadoop-2.7.7&#xff0c;格式化HDFS&#xff0c;开启集群&#xff0c;查看集群状态。&#xff08;HDFS端口为9000&#x…

使用 GPT-4V 全面评估泛化情绪识别 (GER)

概述 由于情绪在人机交互中扮演着重要角色&#xff0c;因此情绪识别备受研究人员关注。目前的情感识别研究主要集中在两个方面&#xff1a;一是识别刺激物引起的情感&#xff0c;并预测观众观看这些刺激物后的感受。另一个方面是分析图像和视频中的人类情绪。在本文中&#xf…

8.机器学习--决策树

(⊙﹏⊙)下周有要开组会&#xff0c;不知道该说啥&#xff0c;啊啊啊啊&#x1f62b; 目录 1.基本概念 2.ID3算法 3.C4.5算法 4.CART算法 5.连续与缺失值处理 5.1.连续值处理 5.2.缺失值处理 6.剪枝处理 6.1.预剪枝策略 6.2.后剪枝策略 7.实例代码 1.基本概念 提…