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

多线程创建方式三:实现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代表着线程任务对象
http://www.lryc.cn/news/531583.html

相关文章:

  • Linux下的编辑器 —— vim
  • Docker技术相关学习二
  • 【人工智能】多模态学习在Python中的应用:结合图像与文本数据的深度探索
  • 【MySQL】常用语句
  • Docker网络基础
  • 重新刷题求职2-DAY2
  • [STM32 标准库]EXTI应用场景 功能框图 寄存器
  • Slint的学习
  • STM32 DMA+AD多通道
  • 如何构建ObjC语言编译环境?构建无比简洁的clang编译ObjC环境?Windows搭建Swift语言编译环境?
  • 【C语言】指针详解:概念、类型与解引用
  • VoIP中常见术语
  • 360嵌入式开发面试题及参考答案
  • 物理群晖SA6400核显直通win10虚拟机(VMM)
  • 【NLP 20、Encoding编码 和 Embedding嵌入】
  • 雷赛LC2000
  • ESP32开发工具介绍:Thonny——初学者的MicroPython利器
  • 【Go语言圣经】第六节:方法
  • 【Leetcode刷题记录】45. 跳跃游戏 II--贪心算法
  • mysql_init和mysql_real_connect的形象化认识
  • Qt网络相关
  • deepseek接入pycharm 进行AI编程
  • Verilog基础(三):过程
  • 生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (上)
  • .Net WebAPI -[HttpPut(“{fileServiceId:int}“)]
  • [EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型
  • C基础寒假练习(7)
  • Ajax:重塑Web交互体验的人性化探索
  • 【DeepSeek背后的技术】系列二:大模型知识蒸馏(Knowledge Distillation)
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.14 内存映射:处理超大型数组的终极方案