扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Runnable、Callable、Future、FutureTask 及应用是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
创新互联主要从事成都网站制作、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务潮安,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
一般创建线程只有两种方式,一种是继承Thread,一种是实现Runnable接口。但是这两种创建方式有一个致命的缺点就是没有返回值,没返回值就让人很苦恼了啊。得用共享变量或者其他通信方式才能得到线程处理完的结果,就有点麻烦。
还有一般不提倡使用继承Thread来创建线程方式,因为Java只有单继承,不能继承多个。但是Runnable是接口,所以可以让你的实现类同时实现多个接口。而且之后要上线程池,如果之前你是用Runnable来实现的,那就可以直接传入Runnable给线程池进行管理了!
在Java1.5之后就有了Callable、Future。这二种可以提供线程执行完的结果!
接下来简单介绍下Runnable、Callable 、Future、 FutureTask。
请点击输入图片描述
简单应用
请点击输入图片描述
简单应用,它不能直接配合Thread 使用。
简单应用
FutureTask不是接口了,是个class。它实现了RunnableFuture接口
public class FutureTask
而RunnableFuture接口又继承了Runnable和Future
public interface RunnableFuture
因此它可以作为Runnable被线程执行,又可以有Future的那些操作。它的两个构造器如下
简单应用
也就是说如果我们需要返回任务的执行结果我们就得调用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
所以这样有什么用呢?就只用能来判断任务已经执行完毕,就类似于Thread.join。
这还有个
这样就可以得到修改后的结果了!
看完上述内容,你们掌握Runnable、Callable、Future、FutureTask 及应用是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流