多线程的入门(二)线程实现与初步使用
1.实现Runable接口
实现Runable接口,实现run方法;
这种方式创建的线程实现类执行时需要创建Thread实例去运行该任务
示例如下:
package com.example.springbootdamo.Thread;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class RunnableTest implements Runnable{static Logger log = LogManager.getLogger();@Overridepublic void run() {log.info("实现Runable接口的线程任务执行中");}
}
public static void runable(ThreadPoolExecutor poolExecutor) {//创建线程任务对象RunnableTest runnableTest = new RunnableTest();//调用方法的线程执行runnableTest.run();//线程调用Thread thread = new Thread(runnableTest);//重开线程执行thread.start();//调用方法的线程执行thread.run();//无返回值的线程池运行任务poolExecutor.execute(runnableTest);//有返回值的线程池运行任务Future<?> submit = poolExecutor.submit(runnableTest); }运行图如下:
1.继承Thread类
继承Thread类,重写run方法;直接运行run方法 ,调用start(),或者交由线程池执行
package com.example.springbootdamo.Thread;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import java.util.concurrent.TimeUnit;/*** @ClassName ThreadTest* @Description TODO* @Author zoro* @Date 2024/4/4 22:24*/
public class ThreadTest extends Thread{static Logger log = LogManager.getLogger();@Overridepublic void run(){log.info(this.getName()+"继承Thread类的线程任务执行开始");try {//睡五秒this.sleep(5);log.info(this.getName()+"继承Thread类的线程任务执行了五秒钟");} catch (InterruptedException e) {e.printStackTrace();}log.info(this.getName()+"继承Thread类的线程任务执行结束");}}
运行示例图如下:由日志是被那个线程所以打印的可知当前执行线程为何
3.实现Callable接口
实现Callable接口,实现call方法,利用FutureTask的构造器(入参为callable对象的实现类)创建实例,调用该对象的run方法或者直接用线程池执行该实例,FutureTask实现了RunnableFuture接口,RunnableFuture实现了Runnable与Future接口。
方法实现:
public static void callable(ThreadPoolExecutor poolExecutor) {CallableTest callable = new CallableTest();FutureTask futureTask = new FutureTask<>(callable);//运调用方法的线程行futureTask.run();//线程池调用poolExecutor.execute(futureTask);//线程池运行时,调用方法的线程等待返回值//方式一Future<ResponseBO> submit = poolExecutor.submit(callable);//方式二poolExecutor.submit(futureTask);try {//方式一ResponseBO responseBO = submit.get();log.info(responseBO.getReturnMessage());//方式二ResponseBO responseBO2 = (ResponseBO) futureTask.get();log.info(responseBO2.getReturnMessage()+"+++");} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}运行结果:因为返回值问题,所以调用线程会等待线程执行完任务后继续执行。从下方线程池的工作任务队列workers可知三次都是重新创建的线程
4.线程池创建线程
主要是通过线程池工厂创建
public void threadPool(){//默认线程池工厂ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 5, 5000, TimeUnit.SECONDS, new LinkedBlockingDeque<>());//自定义线程池工厂ThreadPoolExecutor poolExecutor1 = new ThreadPoolExecutor(5, 5, 5000, TimeUnit.SECONDS, new LinkedBlockingDeque<>(),new ThreadFactoryTest()); }线程池创建的线程需要有执行任务对象该对象一般要实现Runable接口或者Callable接口
执行方法有 submit()和execute()两种方式,前者有返回值,后者没有返回值
示例如下:
package com.example.springbootdamo.Thread;import com.example.springbootdamo.ResponseBO;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import java.util.concurrent.*;public class ThreadPoolTest {static Logger log = LogManager.getLogger();public static void main(String[] args) {//创建线程池ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 5, 5000, TimeUnit.SECONDS, new LinkedBlockingDeque<>());callable(poolExecutor);runable(poolExecutor);thread(poolExecutor);log.info("日志打印测试");}public static void callable(ThreadPoolExecutor poolExecutor) {CallableTest callable = new CallableTest();FutureTask futureTask = new FutureTask<>(callable);//线程池调用poolExecutor.execute(futureTask);//线程池运行时,调用方法的线程等待返回值//方式一Future<ResponseBO> submit = poolExecutor.submit(callable);//方式二poolExecutor.submit(futureTask);try {//方式一ResponseBO responseBO = submit.get();log.info(responseBO.getReturnMessage());//方式二ResponseBO responseBO2 = (ResponseBO) futureTask.get();log.info(responseBO2.getReturnMessage()+"+++");} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}public static void runable(ThreadPoolExecutor poolExecutor) {//创建线程任务对象RunnableTest runnableTest = new RunnableTest();//无返回值的线程池运行任务poolExecutor.execute(runnableTest);//有返回值的线程池运行任务Future<?> submit = poolExecutor.submit(runnableTest);}public static void thread(ThreadPoolExecutor poolExecutor) {//创建线程任务对象ThreadTest threadTest = new ThreadTest();//线程池运行任务poolExecutor.execute(threadTest);// 执行的是线程的任务poolExecutor.submit(threadTest, new ResponseBO());}}
运行结果图如下:
相关文章:
多线程的入门(二)线程实现与初步使用
1.实现Runable接口 实现Runable接口,实现run方法; 这种方式创建的线程实现类执行时需要创建Thread实例去运行该任务 示例如下: package com.example.springbootdamo.Thread;import org.apache.logging.log4j.LogManager; import org.apach…...
数据结构(初阶)第二节:顺序表
数据结构(初阶)第一节:数据结构概论-CSDN博客 从本文正式进入对数据结构的讲解,开始前友友们要有C语言的基础,熟练掌握动态内存管理、结构体、指针等章节,方便后续的学习。 目录 顺序表(Sequen…...
鸿蒙OS元服务开发:【(Stage模型)设置应用主窗口】
一、设置应用主窗口说明 在Stage模型下,应用主窗口由UIAbility创建并维护生命周期。在UIAbility的onWindowStageCreate回调中,通过WindowStage获取应用主窗口,即可对其进行属性设置等操作。还可以在应用配置文件中设置应用主窗口的属性&…...
lua学习笔记6(经典问题输出99乘法表)
print("************for循环的99乘法表*************") for i 1, 9 dolocal line "" -- 创建一个局部变量来累积每行的输出--local 是一个关键字,用于声明一个局部变量。for j 1, i doline line .. j .. "*" .. i .. ""…...
物联网行业中,我们如何选择数据库?
在当今数字化潮流中,我们面对的不仅是海量数据,更是时间的涟漪。从生产线的传感器到金融市场的交易记录,时间序列数据成为了理解事物演变和趋势的关键。在面对这样庞大而动态的数据流时,我们需要深入了解一种强大的工具——时序数…...
openstack云计算(一)————openstack安装教程,创建空白虚拟机,虚拟机的环境准备
1、创建空白虚拟机 需要注意的步骤会截图一下,其它的基本都是下一步,默认的即可 ----------------------------------------------------------- 2、在所建的空白虚拟机上安装CentOS 7操作系统 (1)、在安装CentOS 7的启动界面中…...
Linux存储的基本管理
实验环境: 系统里添加两块硬盘 ##1.设备识别## 设备接入系统后都是以文件的形式存在 设备文件名称: SATA/SAS/USB /dev/sda,/dev/sdb ##s SATA, dDISK a第几块 IDE /dev/hd0,/dev/hd1 ##h hard VIRTIO-BLOCK /de…...
Python yield解析:深入理解生成器的魔力
Python中的yield关键字是生成器函数中非常重要的一部分,它可以使函数暂停执行并保存当前状态,同时允许生成器函数返回一个值。本文将详细介绍yield关键字的用法、特性、基本功能、高级功能、实际应用场景以及总结,帮助深入了解yield关键字的作…...
【Linux】GCCGDB
五、GCC & GDB 5.1 gcc 阶段变化命令预处理hello.c->hello.igcc -E 编译hello.i->hello.sgcc -S 汇编hello.s->hello.ogcc -c 链接hello.o->a.outgcc gcc -E hello.c -o 1.i # -o指定输出文件 gcc -E hello.c -g # -g包含提示信息 gcc -D gcc -DDebug <…...
InternLM2-Chat-1.8B 模型测试
在interStudio进行InternLM2-Chat-1.8B模型访问,进入开发机后 配置基础环境 新建conda环境并且进入 conda create -n demo python3.10 -y conda activate demo 下载pytorch等相关包 conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.…...
Flutter 关键字
import ‘package:xxxx.dart’; //源于pub.dev (完美的相对引入) import ‘xxxx.dart’; //自定义文件(库)(参考的相对引入(填写import命令码所在文件的上级文件夹下的文件(库)相对路径))(受到import命令码所在文件的参考路径的影响) import:import不具有传递性(类似…...
Java常用API之Collections类解读
写在开头:本文用于作者学习Java常用API 我将官方文档中Collections类中所有API全测了一遍并打印了结果,日拱一卒,常看常新 addAll() 将所有指定元素添加到指定 collection 中 可以添加一个或多个元素 Testpublic void test_addAl…...
KV260 BOOT.BIN更新 ubuntu22.04 netplan修改IP
KV260 2022.2设置 BOOT.BIN升级 KV260开发板需要先更新BOOT.BIN到2022.2版本,命令如下: sudo xmutil bootfw_update -i “BOOT-k26-starter-kit-202305_2022.2.bin” 注意BOOT.BIN应包含全目录。下面是更新到2022.1 FW的示例,非更新到2022.…...
Android 代码自定义drawble文件实现View圆角背景
简介 相信大多数Android开发都会遇到一个场景,给TextView或Button添加背景颜色,修改圆角,描边等需求。一看到这样的实现效果,自然就是创建drawble文件,设置相关属性shap,color,radius等。然后将…...
C#实现Word文档转Markdown格式(Doc、Docx、RTF、XML、WPS等)
文档格式的多样性丰富了我们的信息交流手段,其中Word文档因其强大的功能性而广受欢迎。然而,在网络分享、版本控制、代码阅读及编写等方面,Markdown因其简洁、易于阅读和编辑的特性而展现出独特的优势。将Word文档转换为Markdown格式…...
信息系统架构设计-以服务为中心的企业整合实践
生命周期 业务分析服务建模架构设计系统开发 案例背景 某航空公司的信息系统已有好几十年的历史。该航空公司的主要业务系统构建于20世纪七八十年代,以IBM的主机系统为主。 近年来,该公司已经在几个主要的核心系统之间构建了用于信息集成的信息Hub(I…...
mysql知识点梳理
mysql知识点梳理 一、InnoDB引擎中的索引策略,了解过吗?二、一条 sql 执行过长的时间,你如何优化,从哪些方面入手?三、索引有哪几种类型?四、SQL 约束有哪几种呢?五、drop、delete、truncate的区…...
版本排序,(如果 版本 是 1,1a,1.1a, 2, 2c , 1c , 1.2a, 3 , 5b , 5)进行排序
如果 版本 是 1,1a,1.1a, 2, 2c , 1c , 1.2a, 3 , 5b , 5 对上面的进行排序 利用 VersionComparator 导入依赖 <dependency><groupId>cn.hutool</groupId…...
Google视觉机器人超级汇总:从RT、RT-2到AutoRT、SARA-RT、RT-Trajectory
前言 随着对视觉语言机器人研究的深入,发现Google的工作很值得深挖,比如RT-2 想到很多工作都是站在Google的肩上做产品和应用,Google真是科技进步的核心推动力,做了大量大模型的基础设施,服 故有了本文…...
python笔记(9)Dictionary(字典)
目录 创建字典 取值 修改字典 删除 内置函数和方法 创建字典 字典键值和value用:隔开,键值是不可变的,而且必须是唯一的,值可以变,可以是任意类型 dict {key1 : value1, key2 : value2 } 1)不允许同…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...



