Runnable:

Runnable的代码非常简单,他是一个接口,且接口中只有一个方法,run(),创建一个类实现他,把一些费时操作写在其中,然后使用某个线程去执行该Runnable实现类即可实现多线程。

Callable:

Callable的代码也非常简单,不同的是他是一个泛型接口,call()函数返回的类型就是创建Callable传进来的V类型,Callable与Runnable的功能大致相同,项目中有些任务是需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做?用Runnable是无法实现的,我们需要用Callable去实现。

Future:

public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException,ExecutionException;
V get(long timeOut,@NotNull TimeUnit unit) throws InterruptedException,ExecutionException,TimeoutException;
}

Future是一个接口,定义了Future对于具体的Runnable或者Callable任务的执行结果进行取消、查询任务是否被取消,查询是否完成,获取结果、

Future的基本用法:

通过上面的代码并运行:

1、线程是属于异步计算模型,所以你不可能从别的线程中得到方法的返回值,这时候,我们就需要使用Future。

2、Future可以监视目标线程调用Call的情况,当你调用Future的get()方法以获得结果的时候,当前线程就开始阻塞,直接call方法结束返回结果。

3、Future引用对象指向的其实就是FutureTask。

总结:Future可以得到其他线程方法的返回值

FutureTask:

FutureTask的父类是RunnableFuture,而RunnableFuture继承了Runnable和Future两个接口

FutureTask的构造方法:

通过上面的构造函数,我们可以看到,

1、FutureTask最终都是执行Callable类型的任务。

2、如果构造函数参数是Runnable,会被Executors.callable方法转换为Callable类型

下面是Executors.callable方法。

最终返回的是一个RunnableAdapter实例。

继续看看RunnableAdapter的实例。

1、RunnableAdapter是一个FutureTask的一个静态内部类并且实现了Callable,也就是说RunnableAdapter是Callable的一个子类

2、call方法实现代码是,执行Runnable的run方法,并返回构造函数中传入的参数result。

FutureTask的总结:

FutureTask实现两个接口,分为是Future和Runnable,所以它既作为Runnable被线程执行,又可以作为Future得到Callable的返回值,这个组合使用的好处在哪里?

eg:假设有一个很费时逻辑需要计算并返回这个值,同时这个值又不是马上需要,就可以使用这个组合(FutureTask),用另一个线程去计算返回值,而当前线程在使用这个返回值的时候可以进行其他的操作,等到需要这个返回值的时候,再通过Future得到。

注意:通过Executor执行线程任务都是以Callable形式,如果传入Runnable都会转化为Callable。

通过new Thread(runnable),只能是Runnable子类形式

  

Java并发-Runnable、Callable、Future、Future Task的更多相关文章

  1. Java并发:Callable、Future和FutureTask

    Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...

  2. 【原创】JAVA并发编程——Callable和Future源码初探

    JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  3. java:并发编程-Callable与Future模式

    自己对线程池的理解: coresize 3 maxsize 5 blockLinkedQuenue 3 当提交的任务在<=3时,创建三个线程干活 大于3时,把任务先加入阻塞式队列,当有空闲的核心 ...

  4. Java 并发编程——Callable+Future+FutureTask

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  5. Java并发编程 - Runnbale、Future、Callable 你不知道的那点事(二)

    Java并发编程 - Runnbale.Future.Callable 你不知道的那点事(一)大致说明了一下 Runnable.Future.Callable 接口之间的关系,也说明了一些内部常用的方 ...

  6. java并发编程--Runnable Callable及Future

    1.Runnable Runnable是个接口,使用很简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合Execu ...

  7. Java并发编程 - Runnbale、Future、Callable 你不知道的那点事(一)

    从事Java开发已经快两年了,都说Java并发编程比较难,比较重要,关键面试必问,但是在我的日常开发过程中,还真的没有过多的用到过并发编程:这不疫情嘛,周末不能瞎逛,就看看师傅们常说的 Runnabl ...

  8. java 并发runable,callable,future,futureTask

    转载自:http://www.cnblogs.com/dolphin0520/p/3949310.html package future_call; import java.util.concurre ...

  9. 【Java并发核心五】Future 和 Callable

    默认情况下,线程Thread对象不具有返回值的功能,如果在需要取得返回值的情况下会极为不方便.jdk1.5中可以使用Future 和 Callable 来获取线程返回值. Callable 可以 看成 ...

  10. 【Java线程】Callable和Future

    Future模式 Future接口是Java线程Future模式的实现,可以来进行异步计算. Future模式可以这样来描述: 我有一个任务,提交给了Future,Future替我完成这个任务.期间我 ...

随机推荐

  1. Qt实现简单的单例模式

    单例模式十分的常见也很常用,Boost库中就有单例的泛型实现,Qt中,可以利用原子指针来实现一个单例模式: class SingleTon{ public: static SingleTon & ...

  2. 网页宽高clientWidth clientHeight获得数值不对的问题

    当网页内容撑不满一屏时,通过以下代码获得整个网页高度会有问题 document.body.clientHeight;document.body.clientWidth; 得到的宽高不对,可能是因为ht ...

  3. DRF中两大视图基类APIView/GenericAPIView的介绍

    (1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父类. APIView与V ...

  4. New Concept English there (1)Typing speed exercise

    Today,I start learn new concept english there,Mainly for listening practice and typing speed exercis ...

  5. 关于命名空间namespace

    虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits).接口.函数和常量. 在声明命名空间之前唯一合法的代码是用于定义源文件编码方 ...

  6. 4. 什么是应用服务器? - JavaEE基础系列

    本文是JavaEE基础系列的第四节. Java EE简介 - JavaEE基础系列 JSR简介 - JavaEE基础系列 什么是JSR参考实现? - JavaEE基础系列 上一节介绍了什么是JSR参考 ...

  7. apk系统签名命令

    java -jar signapk.jar platform.x509.pem platform.pk8 D:/ClockSetting.apk D:/ClockSettingSigned.apk 需 ...

  8. CentOS 6.5 部署 Horizon

    以root用户进行部署,python源也可以使用 http://mirrors.aliyun.com/pypi/simple/ 修改系统 更改SElinux的配置文件 /etc/selinux/con ...

  9. RBM

    1. 玻尔兹曼分布: $$p(E) \thicksim e^{-E/kT} $$ 2. RBM 两层:隐层和可视层, $\mathbf v$, $\mathbf h$ $$v_i \in \{0, 1 ...

  10. shell脚本中执行sql的例子

    这个例子演示了如何在shell脚本中执行多个sql来操作数据库表. #! /bin/sh USER_HOME=/home/`whoami` . /etc/profile if [ -f ${USER_ ...