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

多线程的入门(二)线程实现与初步使用

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接口&#xff0c;实现run方法&#xff1b; 这种方式创建的线程实现类执行时需要创建Thread实例去运行该任务 示例如下&#xff1a; package com.example.springbootdamo.Thread;import org.apache.logging.log4j.LogManager; import org.apach…...

数据结构(初阶)第二节:顺序表

数据结构&#xff08;初阶&#xff09;第一节&#xff1a;数据结构概论-CSDN博客 从本文正式进入对数据结构的讲解&#xff0c;开始前友友们要有C语言的基础&#xff0c;熟练掌握动态内存管理、结构体、指针等章节&#xff0c;方便后续的学习。 目录 顺序表&#xff08;Sequen…...

鸿蒙OS元服务开发:【(Stage模型)设置应用主窗口】

一、设置应用主窗口说明 在Stage模型下&#xff0c;应用主窗口由UIAbility创建并维护生命周期。在UIAbility的onWindowStageCreate回调中&#xff0c;通过WindowStage获取应用主窗口&#xff0c;即可对其进行属性设置等操作。还可以在应用配置文件中设置应用主窗口的属性&…...

lua学习笔记6(经典问题输出99乘法表)

print("************for循环的99乘法表*************") for i 1, 9 dolocal line "" -- 创建一个局部变量来累积每行的输出--local 是一个关键字&#xff0c;用于声明一个局部变量。for j 1, i doline line .. j .. "*" .. i .. ""…...

物联网行业中,我们如何选择数据库?

在当今数字化潮流中&#xff0c;我们面对的不仅是海量数据&#xff0c;更是时间的涟漪。从生产线的传感器到金融市场的交易记录&#xff0c;时间序列数据成为了理解事物演变和趋势的关键。在面对这样庞大而动态的数据流时&#xff0c;我们需要深入了解一种强大的工具——时序数…...

openstack云计算(一)————openstack安装教程,创建空白虚拟机,虚拟机的环境准备

1、创建空白虚拟机 需要注意的步骤会截图一下&#xff0c;其它的基本都是下一步&#xff0c;默认的即可 ----------------------------------------------------------- 2、在所建的空白虚拟机上安装CentOS 7操作系统 &#xff08;1&#xff09;、在安装CentOS 7的启动界面中…...

Linux存储的基本管理

实验环境&#xff1a; 系统里添加两块硬盘 ##1.设备识别## 设备接入系统后都是以文件的形式存在 设备文件名称&#xff1a; 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关键字是生成器函数中非常重要的一部分&#xff0c;它可以使函数暂停执行并保存当前状态&#xff0c;同时允许生成器函数返回一个值。本文将详细介绍yield关键字的用法、特性、基本功能、高级功能、实际应用场景以及总结&#xff0c;帮助深入了解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模型访问&#xff0c;进入开发机后 配置基础环境 新建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&#xff1a;import不具有传递性(类似…...

Java常用API之Collections类解读

写在开头&#xff1a;本文用于作者学习Java常用API 我将官方文档中Collections类中所有API全测了一遍并打印了结果&#xff0c;日拱一卒&#xff0c;常看常新 addAll() 将所有指定元素添加到指定 collection 中 可以添加一个或多个元素 Testpublic void test_addAl…...

KV260 BOOT.BIN更新 ubuntu22.04 netplan修改IP

KV260 2022.2设置 BOOT.BIN升级 KV260开发板需要先更新BOOT.BIN到2022.2版本&#xff0c;命令如下&#xff1a; sudo xmutil bootfw_update -i “BOOT-k26-starter-kit-202305_2022.2.bin” 注意BOOT.BIN应包含全目录。下面是更新到2022.1 FW的示例&#xff0c;非更新到2022.…...

Android 代码自定义drawble文件实现View圆角背景

简介 相信大多数Android开发都会遇到一个场景&#xff0c;给TextView或Button添加背景颜色&#xff0c;修改圆角&#xff0c;描边等需求。一看到这样的实现效果&#xff0c;自然就是创建drawble文件&#xff0c;设置相关属性shap&#xff0c;color&#xff0c;radius等。然后将…...

C#实现Word文档转Markdown格式(Doc、Docx、RTF、XML、WPS等)

文档格式的多样性丰富了我们的信息交流手段&#xff0c;其中Word文档因其强大的功能性而广受欢迎。然而&#xff0c;在网络分享、版本控制、代码阅读及编写等方面&#xff0c;Markdown因其简洁、易于阅读和编辑的特性而展现出独特的优势。将Word文档转换为Markdown格式&#xf…...

信息系统架构设计-以服务为中心的企业整合实践

生命周期 业务分析服务建模架构设计系统开发 案例背景 某航空公司的信息系统已有好几十年的历史。该航空公司的主要业务系统构建于20世纪七八十年代&#xff0c;以IBM的主机系统为主。 近年来&#xff0c;该公司已经在几个主要的核心系统之间构建了用于信息集成的信息Hub(I…...

mysql知识点梳理

mysql知识点梳理 一、InnoDB引擎中的索引策略&#xff0c;了解过吗&#xff1f;二、一条 sql 执行过长的时间&#xff0c;你如何优化&#xff0c;从哪些方面入手&#xff1f;三、索引有哪几种类型&#xff1f;四、SQL 约束有哪几种呢&#xff1f;五、drop、delete、truncate的区…...

版本排序,(如果 版本 是 1,1a,1.1a, 2, 2c , 1c , 1.2a, 3 , 5b , 5)进行排序

如果 版本 是 1&#xff0c;1a&#xff0c;1.1a&#xff0c; 2&#xff0c; 2c &#xff0c; 1c &#xff0c; 1.2a&#xff0c; 3 &#xff0c; 5b &#xff0c; 5 对上面的进行排序 利用 VersionComparator 导入依赖 <dependency><groupId>cn.hutool</groupId…...

Google视觉机器人超级汇总:从RT、RT-2到AutoRT、SARA-RT、RT-Trajectory

前言 随着对视觉语言机器人研究的深入&#xff0c;发现Google的工作很值得深挖&#xff0c;比如RT-2 ​想到很多工作都是站在Google的肩上做产品和应用&#xff0c;​Google真是科技进步的核心推动力&#xff0c;做了大量大模型的基础设施&#xff0c;服 故有了本文&#xf…...

python笔记(9)Dictionary(字典)

目录 创建字典 取值 修改字典 删除 内置函数和方法 创建字典 字典键值和value用&#xff1a;隔开&#xff0c;键值是不可变的&#xff0c;而且必须是唯一的&#xff0c;值可以变&#xff0c;可以是任意类型 dict {key1 : value1, key2 : value2 } 1&#xff09;不允许同…...

call、apply和bind的原理及使用场景

在JavaScript 中&#xff0c;call、apply 和 bind 是 Function 对象自带的三个方法&#xff0c;这三个方法的主要作用是改变函数中的 this 指向&#xff0c;从而可以达到接花移木的效果 原理&#xff1a; 1、call(thisArgs [,args...]) 该方法可以传递一个thisArgs参数和一个…...

PHP异步I/O迁移紧急预案(含同步代码自动转换工具链+CI/CD熔断检测脚本)

第一章&#xff1a;PHP异步I/O迁移紧急预案概览当传统阻塞式 PHP 应用遭遇高并发 I/O 瓶颈&#xff08;如大量 HTTP 请求、数据库查询或文件读写&#xff09;&#xff0c;服务响应延迟激增、连接池耗尽、CPU 利用率反常偏低——此时&#xff0c;异步 I/O 迁移已非优化选项&…...

周测复盘【前缀和and差分】

其实存了三个草稿没发&#xff0c;因为题解半路解不出来了。 花了四十分钟搞三个平台关联&#xff0c;最后一道题还是没来得及交上哈哈&#xff0c;OK直接进入正题 题目A Atcoder Trifecta 题目翻译&#xff1a; 编号为1到N的N匹马进行了一场比赛 所有马匹同时起跑&#x…...

雅虎日本母公司将164个OpenStack集群整合为一个

LY Corporation是一家日本互联网巨头&#xff0c;旗下业务涵盖即时通讯、电子商务和支付等领域&#xff0c;在亚洲多个国家占据重要地位。该公司近日披露&#xff0c;正计划将高度定制化的OpenStack云平台替换为更标准化的开源云架构&#xff0c;并在此过程中推进大规模的资源整…...

揭秘AI写教材技巧!利用AI教材写作实现低查重、高质量教材编写!

教材创作&#xff1a;AI工具助力原创与合规平衡 在教材编写过程中&#xff0c;如何做到原创与合规的平衡是一个重要的议题。很多时候&#xff0c;创作者会在借鉴优秀教材时担心查重率超标&#xff0c;而在自行撰写知识点时又可能面临逻辑不够严谨和内容不准确的问题。引用他人…...

贵州公共活动策划公司名录

2026年想在贵州办一场出圈的公共活动&#xff1f;从企业年会到文化展览&#xff0c;从体育赛事到艺术节庆&#xff0c;选对策划公司是关键&#xff01;但贵州公共活动策划公司鱼龙混杂&#xff0c;如何避开“低价陷阱”“执行脱节”等坑&#xff1f;本文结合本地市场真实案例&a…...

【传统图像增强算法3】- 伽马校正(Gamma Correction)完全解析

三、伽马校正&#xff08;Gamma Correction&#xff09; 3.1 伽马校正核心定义与应用价值 在图像增强、显示校准的实际应用中&#xff0c;我们常常会遇到一个问题&#xff1a;人眼对亮度的感知是非线性的&#xff0c;而显示设备&#xff08;LCD/OLED/CRT&#xff09;的输入输出…...

L2-2、构建高效可复用的 AI 指令集 —— Prompt 模板化与结构化输出

1. 为什么需要构建可复用的AI指令集 第一次用ChatGPT时&#xff0c;我像个无头苍蝇一样反复输入相似的指令。早上要数据分析报告&#xff0c;下午要会议纪要&#xff0c;每次都得从头解释需求。直到有次同事发来一个txt文件&#xff0c;里面全是格式统一的提问模板——那一刻我…...

HWA_03 leetcode874模拟行走机器人

题目map方法的作用解题思路 class Solution:def robotSim(self, commands: List[int], obstacles: List[List[int]]) -> int:#初始化结果result 0#从原点0&#xff0c;0位置开始出发x0y0#机器人前进的方向#初始方向:正北#0表示向北#1表示向东#2表示向南#3表示向西direction0…...

别再死记硬背Payload了:用BUUCTF Basic靶场案例拆解漏洞利用的本质逻辑

别再死记硬背Payload了&#xff1a;用BUUCTF Basic靶场案例拆解漏洞利用的本质逻辑 在网络安全领域&#xff0c;很多学习者都会陷入一个误区&#xff1a;过度依赖现成的Payload和工具脚本&#xff0c;而忽视了漏洞利用背后的核心逻辑。这种学习方式虽然能快速解决特定题目&…...