使用Callable接口创建线程(Java5新增)

【硬刚Java并发】JAVA多线程(十):线程创建使用 (四)JDK5.0新增线程创建方式 本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Java并发部分补充。 1 新增方式一:实现Callable接口 与使用Runnable相比, Callable功能更强大些 相比run()方法,可以有返回值 方法可以抛出异常 支持泛型的返回值 需要借助FutureTask类,比如获取返回结果 Future接口 可以对具体Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。 FutrueTask是Futrue接口的唯一的实现. 阅读详情

使用Runnable接口创建多线程时,Thread类的作用就是把run()方法包装成线程体。那么是否可以直接把任意方法包装成线程执行体呢?Java目前不行!但C#可以!

也许受此启发,从Java5开始,Java提供了Callable接口,该接口其实就是Runnable接口的增强版,它提供了一个call()方法作为线程执行体,但call()方法比run()方法功能更强大:

1、call()方法可以有返回值

2、call()方法可以声明抛出异常

因此完全可以提供一个Callable对象作为Thread的target,而该线程的执行体就是该Callable对象的call()方法。

问题是Callable接口是Java5新增的接口,而且它不是Runnable接口的子接口,所以Callable对象不能直接作为Thread的target。而且call()方法还有一个返回值——call()方法并不是直接调用,它是作为线程执行体被调用的。那么如何获取call()方法的返回值呢?

那么如何获取call()方法的返回值呢?

Java5提供了Future接口来代表Callable()接口里call()方法的返回值,并为Future接口提供了一个Futuretask实现类,该实现类实现了Future接口,并实现了Runnable接口——可以作为Thread类的target。

【注:】Callable接口有泛型限制,Callable接口里泛型形参类型与call()方法返回值类型相同。而且Callable接口是函数式接口,因此可以使用Lambda表达式创建Callable对象。

创建并启动有返回值的线程的步骤如下:

1、创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,且该call()方法有返回值,再创建Callable实现类的实例。从Java8开始,可以直接使用Lambda表达式创建Callable对象。

2、使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

3、使用FutureTask对象作为Thread对象的target创建并启动新线程。

4、使用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

下面程序通过实现Callable接口来实现线程类,并启动该线程。

package com.js.demo2;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * 使用callable和future创建线程
 * @author jiangshuai
 *
 */
public class ThirdThread {
	public static void main(String[] args){
		//创建Callable对象
		ThirdThread rt = new ThirdThread();
		//先使用Lambda表达式创建Callable<Integer>对象
		//使用FutureTask来包装Callable对象
		FutureTask<Integer> task = new FutureTask<Integer>((Callable<Integer>)()->{
			int i = 0;
			for(;i<100;i++){
				System.out.println(Thread.currentThread().getName()+"循环变量的i值:"+i);
			}
			//call方法可以有返回值
			return i;
		});
		for (int i = 0;i<100;i++){
			System.out.println(Thread.currentThread().getName()+"循环变量的i值:"+i);
			if(i==20){
				//实质还是以Callable对象来创建并启动线程
				new Thread(task,"有返回值的线程").start();
			}
		}
		try {
			System.out.println("子线程的返回值:"+task.get());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

上面程序中使用Lambda表达式直接创建了Callable对象,这样就无须先创建Callable实现类,再创建Callable对象了。实现Callable接口与Runnable接口并没有太大的差别,只是Callable的call()方法允许声明抛出异常,而且允许带返回值。

运行上面的程序,将看到主线程和call()方法所代表的线程交替执行的情形,程序最后还会输出call()方法的返回值。

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势 本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领 阅读详情

相关推荐

深入解析Simulink中的条件执行子系统:If Action与Switch Case的实战应用

本文深入解析了Simulink中两种核心的条件执行子系统:If Action Subsystem与Switch Case Action Subsystem。通过实战案例详细阐述了其工作原理、正确搭建方法以及与逻辑控制器(If模块/Switch Case模块)的协同机制,帮助工程师实现清晰、可维护的多分支逻辑控制,并规避常见建模错误。

l3m4n的博客 429

3、创建线程方式三:实现Callable接口

一、步骤 1、定义一个线程任务类实现Callable接口,声明线程执行的结果类型。 2、重写线程任务类的call()方法,这个方法可以直接返回执行的结果。 3、创建一个Callable的线程任务对象。 4、把Callable的线程任务对象包装成一个未来任务对象。 5、把未来任务对象包装成线程对象。 6、调用线程start()方法,启动线程。 7、获取线程执行结果。 二、代码 package com.zjl.study.多线程; import java.util.concurrent.Callable; i

Garry 2820

学习记录(十一)--Pattern Recognition投稿记录

上一周特别忽然通知统计建模要答辩,确定是否晋级国赛,一直在准备答辩的事情,所以上一周没有总结周汇报,深刻检讨!!!不过结果是好的,我们组第二名晋级哦。这周主要是跟大家分享一下我投稿PR(Pattern Recognition)的一个时间线,以及投稿后的工作。一、PR从投稿到接收的时间线2025.4.3 Major Revision(ddl4.23) 当时正在弄比赛和另一个着急推进的文章2025.5.30 Minor Revision 这次小修基本上只有一些格式和简单一点点问题。

qq_54949944的博客 1918

创建线程的三种方式、线程运行原理、常见方法、线程状态

文章目录1.创建线程的三种方式1.1 继承Thread类并重写run方法1.2 使用Runnable配合Thread1.3 通过Callable和FutureTask创建线程2.Runnable和Thread的区别3.Thread类源代码剖析4.线程运行原理4.1 栈与栈帧 1.创建线程的三种方式 1. 继承Thread类并重写run方法。 2. 实现Runnable接口,然后实现其run方法。 3. 通过Callable和Future创建线程。 将我们希望线程执行的代码放到 run 方法中,然后通过 st

张大安的博客 6284

二相混合式步进电机闭环矢量控制simulink仿真(含仿真文件)

在位置跟踪伺服系统中二相混合式步进电机闭环矢量控制simulink仿真

qq_39023633的博客 2万+

用HFSS复现经典论文:从零搭建带孔缝屏蔽箱体模型(附完整建模步骤与避坑指南)

本文详细介绍了如何使用HFSS电磁仿真软件复现经典论文中的带孔缝屏蔽箱体模型,包括从零搭建模型、设置激励与边界条件、求解优化及结果验证的全过程。特别提供了建模中的布尔运算陷阱、激励设置技巧等实操难点的避坑指南,帮助工程师和学生深入理解电磁屏蔽效能研究。

weixin_30530339的博客 157

使用Callable接口创建线程

创建线程的方法 一种是通过创建Thread类,另一种是通过使用Runnable创建线程。但是,Runnable缺少的一项功能是,当线程终止时(即run()完成时),我们无法使线程返回结果。为了支持此功能,Java中提供了Callable接口。 当然了还可以使用线程池创建线程。 Callable接口和Runnable接口的区别 Callable接口中定义了需要有返回的任务需要实现的call方法。 比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后, 主线程就去做其他事情了,过了一会

我的博客 2298

基于ESP32的摩托车蓝牙对讲系统开发实践

蓝牙音频传输技术在现代通信中扮演着重要角色,其核心原理是通过无线射频实现数字音频信号的双向传输。在工程实践中,蓝牙HFP协议常用于语音通信场景,而ESP32等嵌入式平台因其低成本和高集成度成为DIY项目的理想选择。本项目通过ESP32-WROOM-32D开发板结合PCM5102 DAC和INMP441数字麦克风等模块,构建了一套摩托车骑行专用的蓝牙对讲系统。该系统特别针对高速移动环境下的风噪抑制和连接稳定性进行了优化,采用数字信号处理技术实现实时降噪,并通过I2S接口确保音频质量。这种方案不仅成本控制在30

weixin_33239721的博客 414

Callable方式创建线程

newFixedThreadPool是Java中的一个线程池类,它是一个固定大小的线程池,线程的数量在创建线程池时就已经确定。线程池中的线程数量一旦被确定,就不会发生改变。在Java中,newFixedThreadPool()方法创建的线程池是一个固定大小的线程池,线程池中的线程数量是固定的,由构造函数传入的参数指定,而任务队列的大小则由内部的阻塞队列来决定。

gulanga5的博客 1652

辉芒微教程第五篇《定时器0实现LED灯闪烁》

定时器定时器,一听就跟个闹钟似的,对于嵌入式定时器大部分的应用中,也的确可以这么理解,但是这只能肤浅地这么理解,实际其功能不仅仅是用来计数定时,但是对于我们这种8位单片机,这么理解就够了。

qq_41809823的博客 723

华为OD机试真题 新系统 2026-09-06 Python&JS【仓储货物有序出库】

某仓储中心有一个货物堆放区,货物编号按乱序堆叠存放,只能从顶部取货,管理员需要将货物按编号从小到大取出。

MISAYAONE的博客 115

Java用Callable接口创建线程

 一、概述  使用Callable接口创建线程能够返回数据。与Runnable接口创建线程的方式有点类似,也是需要通过Thread类来创建线程。由于Thread类的构造函数中没有Callable接口,选用了FutureTask类来作为连接创建线程。  FutureTask类实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable, Future接口。在FutureTask类中构造函数可以传入Callable对象,以此建立关系。  通过FutureTask中的get()

tanxinji的博客 5368

财务惊呼“不可能”!Python 自动识别 PDF 发票,数据秒级录入系统

电子发票(原生 PDF):这种最爽,文字是可以选中的。我们用 PyPDF2 直接提取文本,速度快,准确率 100%。 纸质扫描/拍照发票:这种是图片。必须上 OCR(光学字符识别)。我们要用百度开源的 PaddleOCR,这是目前中文识别效果最好的开源库之一,吊打早已过气的 Tesseract。

BUG猿的博客 1024

java—JDK5.0新增创建多线程的两种方式---实现callable接口 和 使用线程池

到现在为止,一共介绍了四种创建多线程的方法: 继承Thread类 实现Runnable接口 实现Callable接口 使用线程池 3. 实现Callable接口的方式创建线程: package com.atguigu.java2; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;..

希望和大家多多交流技术! 244

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java复习——线程创建之实现Callable接口

package com.atguigu.communication; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** @auther Elding_xrl @create 2020-06-03-17:34 创建线程的方式三:实现Callable接口 —> JDK 5.0新增 */ //

Elding的烂笔头 188

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java多线程(案例+解析)JDK5.0新增的线程的创建方式

新增方式一:实现Callable接口 ●与使用Runnable相比,Callable功能更强大些 ➢相比run()方法, 可以有返回值。 ➢方法可以抛出异常。 ➢支持泛型的返回值。 ➢需要借助FutureTask类, 比如获取返回结果。 ...

程序员猫爪 557

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java 线程的创建方式三--实现Callable接口

新增的线程创建方式(JDK5.0及以后) 实现Callable接口 与使用Runnable接口相比,Callable接口功能更加强大 相比run()方法,call()方法可以有返回值 call()方法可以抛出异常,从而被外界操作捕获 支持泛型的返回值 需要借助FutureTask类,比如获取返回结果 Future接口 可对具体Runnable,Callable任务的执行结果进行取消,查询是否完成,获取结果等

weixin_52629592的博客 201

21.线程的实现方式三 ---实现Callable接口

①Java5.0在Java.util.concurrent提供了一个新的创建执行线程的方式:Callable接口 ②Callable接口类似Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是Runnable不会返回结果,并且无法抛出经过检查的异常。 ③Callable需要依赖FutureTask,FutureTask也可以用作闭锁 案例: import java.u

kfengqingyangk的博客 357

多线程创建方式三之实现Callable接口

Callable 接口  Java 5.0 在java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口   Callable 接口类似于Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是Runnable 不会返回结果,并且无法抛出经过检查的异常。   Callable 需要依赖FutureTask ,FutureTask 也可以用

lengjinghk的博客 470

线程的创建方式

线程的创建方式 方式一:继承Thread类 方式二:实现Runnable接口 方式三:实现Callable接口 --JDK5.0新增 代码演示: //1.创建一个实现Callable的实现类 class NumThread implements Callable { //2.实现call方法,将此线程需要执行的操作声明在call()中 @override public Object call() throws Exception { int sum = 0; for (int i = 1;

weixin_45990065的博客 143

Java创建线程的方式

Java创建线程的方式

淡墨青衫、剑轻吟 136

多线程-创建与使用

多线程-创建与使用创建方式1 继承Thread类的方式2 实现Runnable接口的方式3 实现Callable接口 jdk5.0新增4 线程池 创建方式 1 继承Thread类的方式 2 实现Runnable接口的方式 3 实现Callable接口 jdk5.0新增 4 线程池 ...

ly10228的博客 144

Java21多线程2:线程的通信、JDK5新增创建线程的方式

线程间的通信、JDK5新增两种创建线程的方式(实现Callable接口与 线程池Pool)、illegalmonitorstateexception非法监视器状态异常

Bruce的博客 345

Java多线程与线程安全 JDK5.0新增Lock

Java多线程与线程安全 利用多线程创建个3售票窗口为例 1.继承于thread类来创建多线程 public class Threadway extends Thread{ private static int ticket =100; public static void main(String[] args) { Threadway threadway = n...

qq_44838755的博客 418

Java 多线程

(program):是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。(process):是程序的一次执行过程,或是正在运行的一个程序。动态过程:有它自身的产生、存在和消亡的过程。(thread):进程可进一步细化为线程,是一个程序内部的一条执行路径。

m0_74968370的博客 934

线程的概念、创建和使用

一、基本概念 :程序、进程、线程 1.1 程序 程序是为完成特定的任务,用某种语言编写的一组指令的集合。程序是指一段静态的代码,静态的对象。 1.2 进程 是指程序的一次执行过程,或是正在运行的程序。进程是资源分配的基本单位,是一个动态的过程:它有自身生命周期。 比如:运行中的QQ,运行中的MP3播放器 1.3 线程 进程可进一步细化为线程,是一个程序内部的一条执行路径。若一个进程同一时间并行执行多个线程,就是支持多线程的。线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器,线程切换的开销小。一

weixin_44179811的博客 264
上一篇: HTTP中GET与POST方法有什么区别
下一篇: 初识Hadoop
Yes_JiangShuai
博客等级 码龄10年 149粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值