千家信息网

Runnable、Callable、Future、FutureTask 及应用是怎样的

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,Runnable、Callable、Future、FutureTask 及应用是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一般
千家信息网最后更新 2026年11月02日Runnable、Callable、Future、FutureTask 及应用是怎样的

Runnable、Callable、Future、FutureTask 及应用是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一般创建线程只有两种方式,一种是继承Thread,一种是实现Runnable接口。但是这两种创建方式有一个致命的缺点就是没有返回值,没返回值就让人很苦恼了啊。得用共享变量或者其他通信方式才能得到线程处理完的结果,就有点麻烦。

还有一般不提倡使用继承Thread来创建线程方式,因为Java只有单继承,不能继承多个。但是Runnable是接口,所以可以让你的实现类同时实现多个接口。而且之后要上线程池,如果之前你是用Runnable来实现的,那就可以直接传入Runnable给线程池进行管理了!

在Java1.5之后就有了Callable、Future。这二种可以提供线程执行完的结果!

接下来简单介绍下Runnable、Callable 、Future、 FutureTask。

Runnable

Runnable 是一个接口,简单就一个方法,实现run方法,在run方法里面编写你要执行的代码就行了,但是没有任务返回接口,并且无法抛出异常。

请点击输入图片描述

简单应用

请点击输入图片描述

Callable

Callable也是一个接口,很简单就一个call方法,在call方法里面编写你要执行的代码就行了,返回的就是执行的结果了。和Runnable 差别就是它有返回的结果,并且可以抛出异常!一般配合ThreadPoolExecutor使用的。

简单应用,它不能直接配合Thread 使用。

Future

Future也是一个接口,它可以对具体的Runnable或者Callable任务进行取消、判断任务是否已取消、查询任务是否完成、获取任务结果。如果是Runnable的话返回的结果是null(下面会剖析为什么Runnable的任务,Future还能返回结果)。接口里面有以下几个方法。注意两个get方法都会阻塞当前调用get的线程,直到返回结果或者超时才会唤醒当前的线程。

简单应用

FutureTask

因为Future只是一个接口,所以是无法直接用来创建对象使用的,因此就有了下面的FutureTask。

FutureTask不是接口了,是个class。它实现了RunnableFuture接口

public class FutureTask implements RunnableFuture

而RunnableFuture接口又继承了Runnable和Future

public interface RunnableFuture extends Runnable, Future

因此它可以作为Runnable被线程执行,又可以有Future的那些操作。它的两个构造器如下

简单应用

线程池应用

一般情况我们在用多线程的时候都会上线程池,而且一般我们使用ThreadPoolExecutor来创建线程池,我的上篇文章已经讲述了ThreadPoolExecutor,这里再补充一下submit用法。

也就是说如果我们需要返回任务的执行结果我们就得调用submit方法而不是execute。

submit也不神秘就是封装了一下我们的任务再execute

newTaskFor方法是new了一个FutureTask返回。

所以三个方法其实都是把task转成FutureTask,如果task是Callable,就直接赋值。如果是Runnable 就转为Callable再赋值

task是Callable的情况

task是Runnable 的情况

看了源码就揭开了神秘面纱了,就是因为Future需要返回结果,所以内部task必须是Callable,如果task是Runnable 我就造个假,偷天换日,在Runnable 外面包个Callable马甲,返回的结果在构造时就写好。

如果是调用Future submit(Runnable task);提交任务,构造的时候就直接是RunnableFuture ftask = newTaskFor(task, null);直接塞了个null。所以调用Future.get时,拿到的就是null。

所以这样有什么用呢?就只用能来判断任务已经执行完毕,就类似于Thread.join。

这还有个 Future submit(Runnable task, T result);你可能会奇怪这有啥用啊,你传入一个result,Future.get的时候返回的不还是这个result嘛。是个没错,但是这样用就行了!

这样就可以得到修改后的结果了!

看完上述内容,你们掌握Runnable、Callable、Future、FutureTask 及应用是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

接口 方法 结果 线程 任务 应用 就是 方式 情况 时候 两个 代码 内容 只有 图片 多个 更多 问题 输入 苦恼 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网高科技 互联网是第几次科技革命的成果 智网互联网科技 滨湖区互联网智能科技产品供应 成都仁贤领冠互联网科技有限公司 广西拼得多互联网科技有限公司 互联网 科技馆 剑昆互联网络科技有限公司临桂 现代互联网科技股 福建科技产业互联网发展 消费医药和互联网科技 工业互联网展湾科技股份有限公司 21世纪互联网科技成就 四川互联网展示科技馆设计 互联网科技融合创新 2021世界互联网领先科技成果发布 广州燕处互联网科技有限公司 互联网科技职业技能培训学校 众联互联网络科技 宁波允成互联网科技有限公司 华服互联网科技靠谱吗 天津市摩尔互联网科技 北京互联网科技 互联网校园科技培训 互联网还是高科技吗 厦门千工互联网科技有限公司 互联网时代的科技公司 兰石爱特工业互联网科技分公司 福仕德教育科技互联网 安徽零酒互联网科技有限公司
0