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. 【zzuli-1923】表达式求值

    题目描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+.3. 如果 X 和 Y 是 表达式,则 ...

  2. C#学习历程(三)[基础概念]

    >>简单描述OOP 面向对象编程是由面向过程编程发展而来,不再注重于具体的步骤,而是更多的聚焦于对象. 以对象为载体,然后去完善对象的特点(属性),然后实现对象的具体的功能,同时处理对象与 ...

  3. Linq的使用 <一>

    一.种类 1.Linq to Objects,实现了IEnumerable<T>集合对象的集成查询 2.Linq to sql,针对关系数据库MSSQL的解释查询 3.Linq to En ...

  4. 多线程相关(pthread 、NSThread 、GCD、NSOperation)

    进程 进程是指在系统中正在运行的一个应用程序 线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 1个线程中任务的执行是串行的(执行完上一个才能执行下一个) 多线程 1个进程中可以 ...

  5. linux系统挂载NTFS移动硬盘

    有时候做大数据量迁移时,为了快速迁移大数据,有可能在Linux服务器上临时挂载NTFS格式的移动硬盘, 一般情况下,Linux是识别不了NTFS格式移动硬盘的(需要重编译Linux核心才能,加挂NTF ...

  6. 第6课:datetime模块、操作数据库、__name__、redis、mock接口

    1.  datetime模块 import datetime print(datetime.datetime.today()) # 当前时间 2018-01-23 17:22:35.739667 pr ...

  7. jinfo用法说明

    以下几种用法 -flags pid :打印当前VM的参数 -flag <name> pid:打印指定JVM的参数值 -flag [+|-]<name> pid:设置指定JVM参 ...

  8. C++隐式类类型转化

    隐式类类型转换:可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换 class Person { public: Person(): mName()name, mAge ...

  9. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  10. 启动Windows防火墙提示“0x8007042c"

    win8.1 启动防火墙是报错:启动Windows防火墙提示“0x8007042c" 一.检查服务 1,右击开始->运行->输入“services.msc” 打开服务 在框中找到 ...