Java为什么要使用线程池?

  • 前言
    • 1.对线程的管理更加的规范化
    • 2.降低创建线程和销毁线程的开销

前言

之前对于Java线程池的理解,一直停留在:对于Java中的多线程机制来说,如果不使用线程池的话,线程的使用就会变得杂乱无章。这一步。一直没有深入去理解为什么其更深层次的原因,今天来仔细思考一下,并记录我自己的理解。
在这里插入图片描述

1.对线程的管理更加的规范化

如果不使用线程池的话,对于一个系统来说,最多可以使用多少个线程,每个线程最多可以被占用多长时间避免别的任务产生“饥饿”问题都是不好被控制的,可能需要自己编写相应的逻辑来控制,但是如果使用了线程池的话,我就可以规定这个系统所使用的线程都不能自己创建,都只能从这个线程池中来获取,所以我可以使用这个线程池对这个系统会用到的所有线程进行一个统一的管理。
包括以下几个部分的管理:
1.限制最大的线程数量:,防止系统可以获得的线程数量过多,从而导致CPU的大部分时间都用在了切换线程上,而用在处理线程中的任务上的时间所剩无几,降低了效率。同时,如果不限制最大线程数量的话,很有可能导致OOM(OUT OF MEMORY)问题,因为每个线程都是在内存中开辟一个线程栈(Java中的栈空间是JVM控制的,总共就只有那么大。)还会创建一个线程控制块的。
2.代替手动管理: 对于一个线程来说,它的创建、启动、关闭如果全靠程序员去手动管理的话,手动管理起来会非常复杂,还有可能管理不当发生死锁的问题,所以线程池封装了线程管理的机制,代替程序员去更好地管理线程。
3.

2.降低创建线程和销毁线程的开销

试想一下,如果没有线程池,那么我每次想要完成一个任务都要创建一个线程,然后在该任务完成之后再将其销毁。
但是要知道线程在创建的时候计算机会在JVM给它规定的线程栈空间中挑出一块合适的内存分配给它,并且还会创建一个线程控制块、执行系统调用指令、在操作系统的线程控制表里维护线程队列…这些操作都会耗费CPU的时间(这些操作也可以叫做线程自身的上下文)。并且在销毁的时候也是,OS 需要释放它占用的栈内存、线程控制块、内核对象。这些都会需要CPU的时间。很浪费性能。
而使用了线程池之后,一切就不一样了。线程池创建 固定数量的线程,当有任务到来时,直接复用现有线程,而不是每次都创建新线程。这样就避免了频繁的系统调用、内存分配、CPU 上下文切换。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别分库分表,时序数据库 TDengine 解锁燃气监控新可能

达成效果: 从 MySQL 迁移至 TDengine 后,设备数据自动分片,运维更简单。 列式存储可减少 50% 的存储占用,单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内,提升应急管理效率。 新架构支持未来…

TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“

原因: 初始化时处于内网环境下,Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复: vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题

【Linux】POSIX信号量与基于环形队列的生产消费者模型

目录 一、POSIX信号量: 接口: 二、基于环形队列的生产消费者模型 环形队列: 单生产单消费实现代码: RingQueue.hpp: main.cc: 多生产多消费实现代码: RingQueue.hpp: main.…

【13】Ajax爬取案例实战

目录 一、准备工作 二、爬取目标 三、初步探索:如何判断网页是经js渲染过的? 四、爬取列表页 4.1 分析Ajax接口逻辑 4.2 观察响应的数据 4.3 代码实现 (1)导入库 (2)定义一个通用的爬取方法…

嵌入式八股RTOS与Linux---网络系统篇

前言 关于计网的什么TCP三次握手 几层模型啊TCP报文啥的不在这里讲,会单独分成一个计算机网络模块   这里主要介绍介绍lwip和socket FreeRTOS下的网络接口–移植LWIP 实际上FreeRTOS并不自带网络接口,我们一般会通过移植lwip协议栈让FreeRTOS可以通过网络接口收发数据,具体可…

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练 1.2025新版懒人精灵-实战红果搜索关键词刷视频:https://www.bilibili.com/video/BV1eK9kY7EWV 2.懒人精灵-全分辨率节点识别(红果看广告领金币小实战):https://www.bili…

【更新中】【React】基础版React + Redux实现教程(Vite + React + Redux + TypeScript)

本项目是一个在react中,使用 redux 管理状态的基础版实现教程,用简单的案例练习redux的使用,旨在帮助学习 redux 的状态管理机制,包括 store、action、reducer、dispatch 等核心概念。 项目地址:https://github.com/Yv…

【MySQL】从零开始:掌握MySQL数据库的核心概念(四)

人们之所以不愿改变,是因为害怕未知。但历史唯一不变的事实,就是一切都会改变。 前言 这是我自己学习mysql数据库的第四篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的表格约束,没看的同学可以…

AP 场景架构设计(一) :OceanBase 读写分离策略解析

说明:本文内容对应的是 OceanBase 社区版,架构部分不涉及企业版的仲裁副本功能。OceanBase社区版和企业版的能力区别详见: 官网链接。 概述​ 当两种类型的业务共同运行在同一个数据库集群上时,这对数据库的配置等条件提出了较高…

CPU架构和微架构

CPU架构(CPU Architecture) CPU架构是指处理器的整体设计框架,定义了处理器的指令集、寄存器、内存管理方式等。它是处理器设计的顶层规范,决定了软件如何与硬件交互。 主要特点: 指令集架构(ISA, Instr…

6.4 模拟专题:LeetCode1419.数青蛙

1.题目链接:数青蛙 - LeetCode 2.题目描述 给定一个字符串 croakOfFrogs,表示青蛙的鸣叫声序列。每个青蛙必须按顺序发出完整的 “croak” 字符,且多只青蛙可以同时鸣叫。要求计算最少需要多少只青蛙才能完成该字符串,若无法完成…

Linux 搭建dns主域解析,和反向解析

#!/bin/bash # DNS主域名服务 # user li 20250325# 检查当前用户是否为root用户 # 因为配置DNS服务通常需要较高的权限,只有root用户才能进行一些关键操作 if [ "$USER" ! "root" ]; then# 如果不是root用户,输出错误信息echo "…

Leetcode 二进制求和

java solution class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();//首先设置2个指针, 从右往左处理int i a.length() - 1;int j b.length() - 1;int carry 0; //设置进位标志位//从2个字符串的末尾向前遍历while(…

【NLP 49、提示工程 prompt engineering】

目录 一、基本介绍 语言模型生成文本的基本特点 提示工程 prompt engineering 提示工程的优势 使用注意事项 ① 安全问题 ② 可信度问题 ③ 时效性与专业性 二、应用场景 能 ≠ 适合 应用场景 —— 百科知识 应用场景 —— 写文案 应用场景 —— 解释 / 编写…

【NLP 43、文本生成任务】

目录 一、生成式任务 二、seq2seq任务 1.模型结构 2.工作原理 3.局限性 三、自回归语言模型训练 Decoder only 四、自回归模型结构:文本生成任务 —— Embedding LSTM 代码示例 🚀 数据文件 代码流程 Ⅰ、模型初始化 Ⅱ、前向计算 代码运行流程 Ⅲ、加载…

vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu

vscode 通过Remote-ssh插件远程连接服务器报错 could not establish connection to ubuntu,并且出现下面的错误打印: [21:00:57.307] Log Level: 2 [21:00:57.350] SSH Resolver called for "ssh-remoteubuntu", attempt 1 [21:00:57.359] r…

Linux之编辑器vim命令

vi/vim命令: 终端下编辑文件的首选工具,号称编辑器之神 基本上分为三种模式,分别是 命令模式(command mode)>输入vi的命令和快捷键,默认打开文件的时候的模式插入模式(insert mode&#x…

第一天学爬虫

阅读提示:我今天才开始尝试爬虫,写的不好请见谅。 一、准备工具 requests库:发送HTTP请求并获取网页内容。BeautifulSoup库:解析HTML页面并提取数据。pandas库:保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…

MySQL实战(尚硅谷)

要求 代码 # 准备数据 CREATE DATABASE IF NOT EXISTS company;USE company;CREATE TABLE IF NOT EXISTS employees(employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT );DESC employees;CREATE TABLE IF NOT EXISTS departments…

windows下安装sublime

sublime4 alpha 4098 版本 下载 可以根据待破解的版本选择下载 https://www.sublimetext.com/dev crack alpha4098 的licence 在----- BEGIN LICENSE ----- TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A37081C5 D0316412 4584D…