Java Callable,Runnable比较及用法

Posted TopCoderのZeze

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Callable,Runnable比较及用法相关的知识,希望对你有一定的参考价值。

Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run()。
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值。
(3)call方法可以抛出异常,run方法不可以。
(4)运行Callable任务可以拿到一个Future对象,

      Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,

      如果线程没有执行完,Future.get()方法可能会阻塞当前线程的执行;

      如果线程出现异常,Future.get()会throws InterruptedException或者ExecutionException;

      如果线程已经取消,会跑出CancellationException。取消由cancel 方法来执行。

      isDone确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。

      如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明Future<?> 形式类型、并返回 null 作为底层任务的结果。

Future接口的定义如下:

Future模式
      Future模式在请求发生时,会先产生一个Future凭证给发出请求的客户,它的作用就像是Proxy物件,同时,由一个新的执行线程持续进行目标物件的生成(Thread-Per-Message),真正的目标物件生成之后,将之设定至Future之中,而当客户端真正需要目标物件时,目标物件也已经准备好,可以让客户提取使用。
      结合JDK的Future来看,就是你run线程后,你可以把线程的返回值赋给Future并返回一个Future对象。这时你可以立即拿到这个对象,然后进行下面的逻辑。但是如果你要get这个Future中的线程结果,就会被阻塞直到线程结束。
      相当于现在的期房,你把手续和钱都交上去了,就可以马上拿到合同,但只有合同没有房子。这个时候你已经是有房一族了,你可以先去买家电买装修(走下面的其他逻辑)。但是你要把家电和装修放进去,就必须等到房子完工(阻塞)。

以上是关于Java Callable,Runnable比较及用法的主要内容,如果未能解决你的问题,请参考以下文章

Callable,Runnable比较及用法

java并发编程--Runnable Callable及Future

java并发编程--Runnable Callable及Future

浅谈线程runnable和callable的使用及区别

Callable接口及Futrue接口详解

6.2Java多线程Callable接口