run方法是无返回值的,所以在JDK1.5出现了Callable接口 关系类图 Callable Callable接口源码 Callable是一个函数式接口(接口中仅有一个方法),也是一个泛型接口,返回值类型和泛型一致 Future Future接口源码 cancel:取消任务的执行,如果任务已完成或已被取消,则返回false isCancelled:判断任务是否被取消 isDone:判断任务是否...
callable和future的关系 callable是有返回值的,通过Future.get获取callable接口返回的执行结果 还可以通过Future.isDone()来判断任务是否已经执行完了,以及取消任务,给任务限时 可以说通过future来操作callable call未执行完毕之前,可以通过Future.get将主线程阻塞,call执行完毕,主线程拿到结果,主线程再切换到runnable状态 所...
简单来说,Executor就是Runnable和Callable的调度容器,Future就是对于具体的调度任务的执行结果进行查看,最为关键的是Future可以检查对应的任务是否已经完成,也可以阻塞在get方法上一直等待任务返回结果。Runnable和Callable的差别就是Runnable是没有结果可以返回的,就算是通过Future也看不到任务调度的结果的。 /** * 通过简...
类图关系 类图的基本关系 大致画了下类图,箭头元素不是很标准的UML类图元素,用在线工具画的,做了些文字说明,见谅见谅。 图中可以很清晰的看到,RunnableFuture继承了Runnable、Future接口,FutureTask实现了RunnableFuture接口,同时构造函数依赖了Callable接口。 各类方法介绍 Runnable很简单,只有一个run()方法,任务在run()...
2. Callable 、Future 和 FutureTask 先看一下它们的整体关系图谱: 我刚开始看到这幅图,感觉 Java 真是麻烦,已经有了 Thread 和 Runnable 这两种创建线程的方式,为啥又搞这 3 个东西呢? 其实对于 Thread 和 Runable,其 run() 都是无...
这里我们能看到Thread的构造函数支持Runable的参数,不知道到目前大家有没有捋清楚Thread与Runable的关系,我们再总结一下: 1、 Runable原本平民,只是一个普通的接口。 2、Thread实现了Runable接口,并且实现了接口的run方法。 3、Thread提供了重载的构造函数,接收Runable类型的参数。在Thread重写...
类图关系 Future Callable接口,只是用于单纯地去获得返回值,但是什么时候去获取,或者查看线程运行的状态,就需要借助Future Future的源码如下: publicinterfaceFuture<V>{//取消任务的执行,任务已经完成或者已经被取消时,调用此方***返回falsebooleancancel(booleanmayInterruptIfRunning);//判断任务是否被取消booleanisCancelled...
运行结果,和2.1基本一致: 3 Runnable、Callable、Future和FutureTask之间的关系 3.1 整体关系介绍 看过2中的两个栗子,我想你肯定也已经知道揭开这几个对象之间关系的突破口就是FutureTask。 为什么这么说呢? 首先我们应该知道Thread的构造函数就下面这么几个。并且在1中也已经说过,Java中开启线程的方式要么是继承Thread类...
到这里三者的关系应该捋清楚了。 Runnable没返回值,Callable有返回值,但是Thread不接受Callable,所以有了FutureTask。FutureTask实现Runnable,传入Callable对象。这个时候还需要写一些相关的方法(比如取出返回值的方法),然后这些方法就收录到了Future接口中。 Future的另一个使用场景 ...
从UML图上可以看到,FutureTask是直接实现了RunnableFuture接口,而RunnableFuture接口又继承了Runnable和Future接口,因此FutureTask既是Runnable类型,又是Future类型。 当调用submit()方法来向线程池中提交任务时,无论提交的是Runnable类型的任务,还是提交的是Callable类型的任务,最终都是将任务封装成一个FutureTask对象。下面以...