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

Java基础入门·多线程·线程池ThreadPool篇

前言                                                特点分析

线程池ThreadPool                         销毁线程池

 Executor类                ​​​​​​​        ​​​​​​​        ​​​​​​​    Callable接口

线程池使用                 ​​​​​​​        ​​​​​​​        ​​​​​​​    Callable启动线程

 ​​​​​​​ExecutorService接口的方法                                               


前言

在上一篇Java—实现多线程程序 | 入门的文章中,我们初步了解Thread类的用法

第一次书写多线程程序,算是完成一个Java学习的里程碑

接下来我们继续进入多线程的学习

线程池ThreadPool

线程池:线程的缓冲池,目的就是提高效率。 new Thread().start(),线程是内存中的一个独立的方法栈区,JVM没有能力开辟内存空间和OS交互

而线程会频繁地与OS交互浪费资源,线程池就是开辟一个空间,专门用于存储线程对象,可以理解为集合,当线程需要时,就从池子里调用出来,使用结束再丢回线程池,保证了线程不会“死掉”,反复利用,达到高效

线程池的目的是为了提高线程的利用率,减少创建和销毁线程的开销,降低系统资源的消耗,提高系统的稳定性和可靠性。在高并发的环境中,线程池可以有效地控制并发数量,防止线程因互相竞争而产生死锁、饥饿或者系统资源耗尽等问题。

tips:后面学到的数据库连接池也是类似的效果

jdk5开始内置线程池


 Executor类

使用静态方法创建线程池

public static newFixedThreadPool(int nThreads)

创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。

int nThreads是传入线程的数量

 方法的返回值是ExecutorService接口的实现类,管理池子里面的线程


线程池使用 

创建线程池, 线程数量是两个

线程数量虽然可以自行定义,但最好不要过多,浪费资源

ExecutorService es = Executors.newFixedThreadPool(2);

创建线程对象,线程池管理对象Service,调用方法submit提交线程任务,当然,前提是得先写一个Runnable

public class MyRunnable implements Runnable{@Overridepublic void run() {System.out.println("线程开始运行");}
}

ExecutorService接口的方法

submit(Runnable r)提交线程执行的任务

public class ThreadTest {public static void main(String[] args) {ExecutorService es = Executors.newFixedThreadPool(2);Runnable runnable = new MyRunnable();es.submit(runnable);}
}

特点分析

这一次运行代码不知道你们是否发现了不同之处 

以往的代码运行时,程序会自动结束不再运行,而这次你可以看到,程序一直在后台保活,直到我们手动关闭。这就是上文所说线程池的作用:用则拿,不用则还,线程不死

使用了线程池的程序

这里的中文乱码比较懒,没有调整,将就着看哈哈,如果你也遇到了中文乱码的问题而没有找到合适的方法,可以看我的另一篇文章,我想它会对你有所帮助⬇⬇⬇解决IntelliJ IDEA 代码运行时中文出现乱码

 同时,为了更直观地看到线程的执行,我们还可以查看一下线程的名字,然后把runnab对象多submit几次

System.out.println(Thread.currentThread().getName()+"线程开始运行");
public class ThreadTest {public static void main(String[] args) {ExecutorService es = Executors.newFixedThreadPool(2);Runnable runnable = new MyRunnable();es.submit(runnable);es.submit(runnable);es.submit(runnable);es.submit(runnable);es.submit(runnable);}
}
查看使用中的线程名

销毁线程池

当我们不需要使用线程池时,总得让它结束,所以我们就可以把它销毁,自行结束 

es.shutdown();

 此时我们再运行程序,当所有线程不再使用时,运行到这行代码,线程池就被销毁了


Callable接口

Callable也能像Runnable一样建线程,但和Runnable接口有区别

Callable接口有返回值,且Callablecall方法可以抛出异常(Runnable没有)

 Callable的抽象方法只有一个:call

我们尝试使用一下相关代码

public class MyCall implements Callable<V> {public V call() throws Exception {return null;}
}

 注意此处的<V>为泛型,即你需要返回数据的类型,此处我们可以改成String,然后return字符串

public class MyCall implements Callable<String> {public String call() throws Exception {return "返回字符串";}
}

Callable启动线程

线程调用重写方法call,需要使用到线程池,我们依旧可以使用submit,把submit(Runnable r)改为submit(Callable c)提交线程执行的任务,但当我们运行时没有任何输出结果

这时候我们就要使用Future接口,Future submit()方法提交线程任务后,方法有个返回值Future接口类型,而它则可以获取到线程执行后返回的结果

public class CallText {public static void main(String[] args) throws ExecutionException, InterruptedException {//创建线程池ExecutorService es = Executors.newFixedThreadPool(2);//创建线程MyCall myCall = new MyCall();//提交线程任务,使用Callable接口实现类Future<String> future = es.submit(myCall);//返回接口类型Future//接口的方法get,获取线程的返回值String str = future.get();System.out.println("str = "+str);}
}
运行结果

相关文章:

Java基础入门·多线程·线程池ThreadPool篇

前言 特点分析 线程池ThreadPool 销毁线程池 Executor类 ​​​​​​​ ​​​​​​​ ​​​​​​​ Callable接口 线程池使用 ​​​​​​​…...

Trinitycore学习之在vscode查看远端服务器上源码配置

1&#xff1a;安装vscode&#xff0c;去官网下载&#xff0c;这里下载windows版本安装包 .zip https://code.visualstudio.com/Download 2&#xff1a;安装后&#xff0c;安装扩展chinese&#xff0c;使用中文设置&#xff0c;需要重启vscode。 3&#xff1a;安装ssh相关插件…...

583. 两个字符串的删除操作 -- 动规

583. 两个字符串的删除操作 class MinDistance:"""583. 两个字符串的删除操作https://leetcode.cn/problems/delete-operation-for-two-strings/description/"""def solution(self, text1: str, text2: str) -> int:"""这道题…...

SOME/IP

介绍 SOME/IP是一种汽车中间件解决方案&#xff0c;可用于控制消息。它从一开始就被设计为完美地适应不同尺寸和不同操作系统的设备。这包括小型设备&#xff0c;如相机、AUTOSAR 设备&#xff0c;以及头戴设备或远程通信设备。它还确保SOME/IP支持信息娱乐域以及车辆中其他域…...

[2023.09.12]: Yew应用开发的第一个hook--use_state

Yew的SSR模式推荐使用function_component组件&#xff0c;并且在function_component中使用hooks。其中&#xff0c;我使用到的第一个hook是use_state。use_state的设计意图与React中的useState非常相似&#xff0c;都是为了保存并修改当前的状态。然而&#xff0c;由于Yew是用R…...

使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人

使用LangchainGPT向量数据库chromadb 来创建文档对话机器人 一.效果图如下&#xff1a; 二.安装包 pip install langchainpip install chromadbpip install unstructuredpip install jieba三.代码如下 #!/usr/bin/python # -*- coding: UTF-8 -*-import os # 导入os模块&…...

Spring Cloud(Finchley版本)系列教程(一) 服务注册与发现(eureka)

Spring Cloud(Finchley版本)系列教程(一) 服务注册与发现(eureka) 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 如有错误恳请大家批评指正,与大家共同学习、一起成长,万分感谢。 一、构建环境 Spring Cloud的构建工具可以使用Maven或Gr…...

【大数据】美团 DB 数据同步到数据仓库的架构与实践

美团 DB 数据同步到数据仓库的架构与实践 1.背景2.整体架构3.Binlog 实时采集4.离线还原 MySQL 数据5.Kafka2Hive6.对 Camus 的二次开发7.Checkdone 的检测逻辑8.Merge9.Merge 流程举例10.实践一&#xff1a;分库分表的支持11.实践二&#xff1a;删除事件的支持12.总结与展望 1…...

分类预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元数据分类预测

分类预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-CNN-BiGRU多特征分类…...

mac使用squidMan设置代理服务器

1&#xff0c;下载squidMan http://squidman.net/squidman/ 2, 配置SquidMan->Preference 3, mac命令窗口配置 export http_proxy export https_porxy 4&#xff0c;客户端配置&#xff08;centos虚拟机&#xff09; export http_proxyhttp://服务器ip:8080 export https…...

大数据Flink(七十八):SQL 的水印操作(Watermark)

文章目录 SQL 的水印操作(Watermark) 一、为什么要有 WaterMark...

【Linux】Qt Remote之Remote开发环境搭建填坑小记

总体思路 基于WSL2&#xff08;Ubuntu 22.04 LTS&#xff09;原子Alpha开发板进行Qt开发实验&#xff0c;基于Win11通过vscode remote到WSL2&#xff0c;再基于WSL2通过Qt 交叉编译&#xff0c;并通过sshrsync远程到开发板&#xff0c;构建起开发工具链。 Step1 基于Win11通过…...

ATFX汇市:离岸人民币大幅升值,昨日盘中跌破7.3关口

ATFX汇市&#xff1a;美国CPI数据即将公布之际&#xff0c;周一美元指数大跌&#xff0c;带动离岸人民币升值0.85%&#xff0c;实现3月14日以来的最大单日升值幅度&#xff0c;当日汇率&#xff08;USDCNH&#xff09;最低触及7.292&#xff0c;突破7.3000关口。消息面上&#…...

Spring Boot 配置 Knife4j

一、引入 maven <!-- 引入 knife4j 文档--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi2-spring-boot-starter</artifactId> <version>4.1.0</version> </dependency>二…...

Java项目中遇到uv坐标如何转换成经纬度坐标

将UV坐标&#xff08;通常指平面坐标&#xff0c;如二维地图坐标&#xff09;转换为经纬度坐标&#xff08;地理坐标&#xff09;通常需要知道一个参考点的经纬度坐标&#xff0c;以及两者之间的比例关系。这是因为UV坐标通常用于在地图上绘制图形或标记点&#xff0c;而经纬度…...

std : : unordered_map 、 std : : unordered_set

一.简介 std::unordered_map 是C标准库中的一种关联容器&#xff0c;它提供了一种用于存储键-值对的数据结构&#xff0c;其中键是唯一的&#xff0c;且不会按特定顺序排序。与 std::map 不同&#xff0c;std::unordered_map 使用哈希表作为其底层数据结构&#xff0c;因此它具…...

Python解释器和Pycharm的傻瓜式安装部署

给我家憨憨写的python教程 有惊喜等你找噢 ——雁丘 Python解释器Pycharm的安装部署 关于本专栏一 Python解释器1.1 使用命令提示符编写Python程序1.2 用记事本编写Python程序 二 Pycharm的安装三 Pycharm的部署四 Pycharm基础使用技巧4.1 修改主题颜色4.2 修改字体4.3 快速修…...

14 Python使用网络

概述 在上一节&#xff0c;我们介绍了如何在Python中使用Json&#xff0c;包括&#xff1a;Json序列化、Json反序列化、读Json文件、写Json文件、将类对象转换为Json、将Json转换为类对象等内容。在这一节&#xff0c;我们将介绍如何在Python中使用网络。Python网络编程覆盖的范…...

AI ChatGPT 各大开放平台一览 大模型 Prompt

AI ChatGPT 各大开放平台一览 大模型 Prompt 国内 百度 ERNIE Bot 文心一言阿里巴巴 通义千问腾讯 Hunyuan BOT 混元 &#xff08;暂未发布&#xff09;华为 盘古旷视 ChatSpot科大讯飞 讯飞星火网易 子曰&#xff08;暂未发布&#xff09;京东 言犀奇安信 Q-GPT商汤科技 商量S…...

全球汽车安全气囊芯片总体规模分析

安全气囊系统是一种被动安全性的保护系统&#xff0c;它与座椅安全带配合使用&#xff0c;可以为乘员提供有效的防撞保护。在汽车相撞时&#xff0c;汽车安全气囊可使头部受伤率减少25%&#xff0c;面部受伤率减少80%左右。 汽车安全气囊芯片是整个系统的控制核心&#xff0c;并…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...