多线程创建方式三:实现Callable接口
实现Callable第三种方式存在的原因
作用:可以返回线程执行完毕后的结果。
前两种线程创建方式都存在的一个问题:假如线程执行完毕后有一些数据需要返回,他们重写的run方法均不能直接返回结果。
如何实现
● JDK 5.0提供了Callable接口和FutureTask类来实现(多线程的第三种创建方式)。
步骤
1、创建任务对象
> 定义一个类实现Callable接口,重写call方法,封装要做的事情,和要返回的数据。
2、创建Callable接口实现类的对象
3、把Callable接口实现类的对象作为参数传递到FutureTask的构造方法中,创建FutureTask对象成为线程任务对象
//1、先创建一个Callable接口的实现类
class MyCallable implements Callable<String> {private int n;public MyCallable(int n){this.n = n;}//2、实现call方法,定义线程执行体@Overridepublic String call() throws Exception {int sum = 0;for (int i = 0; i <= n; i++) {sum += i;}return "从1-"+n+"子线程计算出的结果是:"+sum;}
}//3、创建Callable接口实现类的对象
Callable c1 = new MyCallable(100);
//4、把Callable接口实现类的对象作为参数传递到FutureTask的构造方法中,创建FutureTask对象成为线程任务对象
/*** 未来任务对象的作用* 1、本质是一个Runnable线程任务对象,因为它是它的实现类。这样子就可以作为参数传递到Thread的构造方法中,创建Thread对象* 2、可以调用FutureTask对象的get方法,获取线程执行结束后的结果*/
FutureTask f1 = new FutureTask<>(c1);//public FutureTask(Callable<V> callable) {}
4、把线程任务对象交给Thread对象。
5、调用Thread对象的start方法启动线程。
6、线程执行完毕后、通过FutureTask对象的的get方法去获取线程任务执行的结果。
//5、把线程任务对象作为参数传递到Thread的构造方法中,创建Thread对象
Thread t1 = new Thread(f1);
//6、启动线程
t1.start();//自动调用call方法
try {//如果主线程发现第一个线程还没有执行完毕,则主线程会一直等待,直到第一个线程执行完毕,主线程才会往下执行/*** FutureTask.get()的阻塞特性导致主线程等待* 主线程调用 FutureTask.get() 时会阻塞并等待子线程执行完毕*/System.out.println(f1.get());
} catch (Exception e) {e.printStackTrace();
}
注意点
1、未来任务(FutureTask)对象的作用
未来任务对象的作用1、本质是一个Runnable线程任务对象,因为它是它的实现类。这样子就可以作为参数传递到Thread的构造方法中,创建Thread对象2、可以调用FutureTask对象的get方法,获取线程执行结束后的结果
2、FutureTask.get()的阻塞特性
FutureTask.get()的阻塞特性导致主线程等待
如果主线程调用 FutureTask.get() 时会阻塞并等待子线程执行完毕,那么主线程发现第一个线程还没有执行完毕,则主线程会一直等待,直到第一个线程执行完毕,主线程才会往下执行
3、FuturTask是Runnable的实现类,所以创建的FutureTask对象才是线程任务对象,因为Runnable代表着线程任务对象
相关文章:
多线程创建方式三:实现Callable接口
实现Callable第三种方式存在的原因 作用:可以返回线程执行完毕后的结果。 前两种线程创建方式都存在的一个问题:假如线程执行完毕后有一些数据需要返回,他们重写的run方法均不能直接返回结果。 如何实现 ● JDK 5.0提供了Callable接口和FutureTask类来…...
Linux下的编辑器 —— vim
目录 1.什么是vim 2.vim的模式 认识常用的三种模式 三种模式之间的切换 命令模式和插入模式的转化 命令模式和底行模式的转化 插入模式和底行模式的转化 3.命令模式下的命令集 光标移动相关的命令 复制粘贴相关命令 撤销删除相关命令 查找相关命令 批量化注释和去…...
Docker技术相关学习二
一、Docker简介 1.Docker之父Solomon Hykes形容docker就像传统的货运集装箱。 2.docker的特点和优势: 轻量级虚拟化:Docker容器相较于传统的虚拟机更加的轻量和高效,能够快速的启动和停止来节省系统资源。 一致性:确保应用程序在不…...
【人工智能】多模态学习在Python中的应用:结合图像与文本数据的深度探索
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 多模态学习是人工智能领域的一个重要研究方向,旨在通过结合多种类型的数据(如图像、文本、音频等)来提高模型的性能。本文将深入探讨多模…...
【MySQL】常用语句
目录 1. 数据库操作2. 表操作3. 数据操作(CRUD)4. 高级查询5. 索引管理6. 用户与权限7. 数据导入导出8. 事务控制9. 其他实用语句注意事项 如果这篇文章对你有所帮助,渴望获得你的一个点赞! 1. 数据库操作 创建数据库 CREATE DATA…...
Docker网络基础
一、Docker网络基础 1.docker安装后会自动创建3中网络,分别为bridge host none docker network ls 2.docker原生bridge网络: docker安装时会创建一个名为docker0的linux bridge,新建的容器会自动桥接到这个接口 bridge模式下没有公有ip,只有宿主机可以…...
重新刷题求职2-DAY2
977. 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后…...
[STM32 标准库]EXTI应用场景 功能框图 寄存器
一、EXTI 外部中断在嵌入式系统中有广泛的应用场景,如按钮开关控制,传感器触发,通信接口中断等。其原理都差不多,STM32会对外部中断引脚的边沿进行检测,若检测到相应的边沿会触发中断,在中断中做出相应的处…...
Slint的学习
Slint是什么 Slint是一个跨平台的UI工具包,支持windows,linux,android,ios,web,可以用它来构建申明式UI,后端代码支持rust,c,python,nodejs等语言。 开源地址:https://github.com/slint-ui/slint 镜像地址:https://kkgithub.com/…...
STM32 DMA+AD多通道
接线图 代码配置 ADC单次扫描DMA单次转运模式 uint16_t AD_Value[4]; //DMAAD多通道 void DMA_Config(void) {//定义结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量 ADC_InitTypeDef ADC_InitStructure; //定义ADC结构体变量 DMA_InitTypeDef DMA_In…...
如何构建ObjC语言编译环境?构建无比简洁的clang编译ObjC环境?Windows搭建Swift语言编译环境?
如何构建ObjC语言编译环境? 除了在线ObjC编译器,本地环境Windows/Mac/Linux均可以搭建ObjC编译环境。 Mac自然不用多说,ObjC是亲儿子。(WSL Ubuntu 22.04) Ubuntu可以安装gobjc/gnustep和gnustep-devel构建编译环境。 sudo apt-get install gobjc gnus…...
【C语言】指针详解:概念、类型与解引用
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯指针的基本概念1. 什么是指针2. 指针的基本操作 💯指针的类型1. 指针的大小2. 指针类型与所指向的数据类型3. 指针类型与数据访问的关系4. 指针类型的实际意…...
VoIP中常见术语
在 VoIP(Voice over Internet Protocol,基于互联网协议的语音传输)技术中,涉及许多专业术语。以下是常见术语及其含义: 1. 核心协议相关 SIP(Session Initiation Protocol,会话发起协议…...
360嵌入式开发面试题及参考答案
解释一下 802.11ax 和 802.11ac/n 有什么区别 速度与带宽 802.11n 支持的最高理论速率为 600Mbps,802.11ac 进一步提升,单流最高可达 866.7Mbps,多流情况下能达到更高,如 1.3Gbps 等。而 802.11ax(Wi-Fi 6)引入了更多先进技术,理论最高速率可达 9.6Gbps,相比前两者有大…...
物理群晖SA6400核显直通win10虚拟机(VMM)
写在前面:请先确保你的核显驱动支持开启SR-IOV 确保你的BIOS开启了以下选项: VT-D VMX IOMMU Above 4G ResizeBAR 自行通过以下命令确认支持情况: dmesg | grep -i iommudmesg | grep DMAR分配1个虚拟vGPU:echo 1 | sudo tee /sy…...
【NLP 20、Encoding编码 和 Embedding嵌入】
目录 一、核心定义与区别 二、常见Encoding编码 (1) 独热编码(One-Hot Encoding) (2) 位置编码(Positional Encoding) (3) 标签编码(Label Encoding) (4) 注意事项 三、常见Embedding词嵌入 (1) 基础词嵌入…...
雷赛LC2000
【一,概述】 这个是中型PLC 【二,外观】 网口编号: 【2】【3】 //默认ip:192.168.1.xxx 【0】【1】 可视化授权不如禾川Q系。 【三,总线轴】 因为本次带的轴是台达A2系列伺服 A2最快总线是【1ms】的倍数…...
ESP32开发工具介绍:Thonny——初学者的MicroPython利器
文章目录 引言什么是 Thonny?为什么选择 Thonny 开发 ESP32?1. **MicroPython 的天然支持**2. **极简的配置流程**3. **适合快速原型开发**如何用 Thonny 开发 ESP32?步骤 1:准备工作步骤 2:烧录 MicroPython 固件步骤 3:在 Thonny 中连接 ESP32步骤 4:编写并运行代码Th…...
【Go语言圣经】第六节:方法
第六章:方法 6.1 方法声明 在函数声明时,在其名字之前放上一个变量,这就是声明了变量对应类型的一个方法,相当于为这种类型定义了一个独占的方法。 下例为 Point 类型声明了计算两个点之间距离的方法: package mai…...
【Leetcode刷题记录】45. 跳跃游戏 II--贪心算法
45. 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 num…...
CODE-II:百万级心电图AI评估基准与深度学习模型实践
1. 项目概述:当心电图遇上AI,我们如何量化“看懂”的能力?心电图,这个在临床诊断中司空见惯的波形图,背后是心脏每一次搏动的电生理活动记录。医生们通过识别P波、QRS波群、T波的形态、间期和节律,来判断心…...
一键部署工具OneClickCopaw:从脚本化到容器化的自动化实践
1. 项目概述与核心价值最近在折腾一些自动化部署和配置管理的工作,发现一个挺有意思的项目,叫iwanglei1/OneClickCopaw。光看这个名字,可能有点摸不着头脑,但如果你也经常需要在不同环境里快速复制一套开发或测试环境,…...
热间隙填充材料在PCB散热设计中的关键应用与选型
1. 热间隙填充材料在PCB散热设计中的核心作用热间隙填充材料(Thermal Gap Filler)是现代电子散热系统中不可或缺的功能性材料。作为一名经历过数十个散热方案设计的工程师,我深刻理解这类材料在解决"散热器与PCB之间公差累积"问题上…...
Tiny AI Client:零依赖、轻量化的AI API调用库设计与实战
1. 项目概述与核心价值最近在折腾AI应用本地化部署和轻量化客户端时,发现了一个挺有意思的项目——piEsposito/tiny-ai-client。这名字起得就很直白,“tiny”意味着小巧,“ai-client”点明了它是一个AI客户端。乍一看,你可能会觉得…...
汽车产业变革:从颠覆到协作的生态模式与SDV实践
1. 从“颠覆”到“协作”:汽车产业权力格局的深层变革在科技行业浸淫超过二十五年,我经历过三次真正意义上的“颠覆时刻”。第一次是2006年,Luminary Micro推出首款Arm Cortex-M3微控制器,它彻底改变了嵌入式系统的游戏规则。第二…...
Windows风扇控制终极解决方案:FanControl深度配置指南
Windows风扇控制终极解决方案:FanControl深度配置指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa…...
模块化前端框架设计:从原子状态到组合式架构的工程实践
1. 项目概述:一个轻量级、模块化的现代Web应用框架最近在梳理手头的几个前端项目,发现随着功能迭代,代码越来越臃肿,不同项目间的基础工具函数、状态管理逻辑、路由配置总是要重新写一遍,或者复制粘贴,维护…...
STK Astrogator模块避坑指南:从Target Sequence优化失败到成功收敛的5个关键设置
STK Astrogator模块避坑指南:从Target Sequence优化失败到成功收敛的5个关键设置 轨道优化是航天任务设计中的关键环节,而STK的Astrogator模块作为行业标准工具,其Target Sequence功能既能实现复杂机动规划,也常因参数设置不当导致…...
如何在5分钟内将你的普通鼠标变成macOS生产力神器
如何在5分钟内将你的普通鼠标变成macOS生产力神器 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 还在为macOS上鼠标滚轮生硬、侧键闲置而烦恼吗…...
告别Arduino IDE:用Python玩转ESP8266,保姆级Micropython固件烧录与点灯实战
从Arduino到Micropython:用Python解锁ESP8266的物联网潜能 当硬件爱好者第一次接触Arduino时,往往会被其简单的开发方式所吸引。但随着项目复杂度提升,C/C的编译等待、内存管理和语法冗长开始成为创新路上的绊脚石。这就是为什么越来越多的开…...
