Callable接口实现多线程编程方法与使用详解
时间:2026-08-16 | 作者:多维游侠 | 阅读:0通过Thread类和Runnable接口实现多线程时,需要重写run()方法。但是由于该方法没有返回值,因此无法从多个线程中获取返回结果。
为了解决这个问题,从JDK 5开始,Ja va提供了一个新的Callable接口,来满足这种既能创建多线程又可以有返回值的需求。
Callable接口实现多线程的基本思路
如果用Callable接口来实现多线程,整体思路其实和Runnable那套做法是一样的。
本质上,还是借助Thread类的有参构造方法来启动线程,并传入一个Runnable接口类型的参数。
真正的区别在于,这里传进去的不再是普通的Runnable实现类,而是Runnable接口的子类FutureTask对象;至于FutureTask内部,则进一步封装了一个带返回值的Callable接口实现类。
创建并启动线程的主要步骤
使用实现Callable接口的方式来创建并启动线程实例的主要步骤如下:
(1)创建一个Callable接口的实现类,同时重写Callable接口的call()方法;
(2)创建Callable接口的实现类对象;
(3)通过FutureTask线程结果处理类的有参构造方法来封装Callable接口实现类对象;
(4)使用参数为FutureTask类对象的Thread有参构造方法创建Thread线程实例;
(5)调用线程实例的start()方法启动线程。
案例演示
接下来通过一个案例来演示如何通过实现Callable接口的方式来实现多线程,如文件1所示。
文件1 Example03.ja va
1 import ja va.util.concurrent.*;
2 // 1、定义一个实现Callable接口的实现类
3 class MyThread3 implements Callable<Object> {
4 // 1.1、重写Callable接口的call()方法
5 public Object call() throws Exception {
6 int i = 0;
7 while (i++ < 5) {
8 System.out.println(Thread.currentThread().getName()
9 + "的call()方法在运行");
10 }
11 return i;
12 }
13 }
14
15 public class Example03 {
16 public static void main(String[] args) throws InterruptedException,
17 ExecutionException {
18 // 2、创建Callable接口的实现类对象
19 MyThread3 myThread3 = new MyThread3();
20 // 3、使用FutureTask封装Callable接口
21 FutureTask
运行结果如图1所示。
图1 运行结果
从图1可以看出,文件1所示的案例通过实现Callable接口的方式实现了多线程并带有返回结果。
FutureTask的作用与继承关系
用Callable接口来实现多线程时,返回结果通常会交给FutureTask来统一封装和管理。
它的直接父接口是RunnableFuture,名字已经说明了这一点:RunnableFuture本质上就是Runnable和Future的组合体。
接下来,结合一张示意图来看FutureTask类的继承关系,如图2所示。
图2 FutureTask继承关系图
从图2可以看出,FutureTask本质是Runnable接口和Future接口的实现类,而Future则是JDK 5提供的用来管理线程执行返回结果的。
Future接口的方法
其中Future接口中共有5个方法,用来对线程结果进行管理,这些方法及说明如表1所示。
表1 Future接口的方法
| 方法声明 | 功能描述 |
|---|---|
| boolean cancel(boolean mayInterruptIfRunning) | 用于取消任务,参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行的任务 |
| boolean isCancelled() | 判断任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true |
| boolean isDone() | 判断任务是否已经完成,若任务完成,则返回true |
| V get() | 用于获取执行结果,这个方法会发生阻塞,一直等到任务执行完毕才返回执行结果 |
| V get(long timeout, TimeUnit unit) | 用于在指定时间内获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null |
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15

