多线程中最常用的是Runnable接口,定义了一次任务执行的内容。但是Runnable接口无法得到返回值,而且也无法让执行端捕获到异常。所以就有了Callable接口。

public interface Callable<V> {/*** Computes a result, or throws an exception if unable to do so.** @return computed result* @throws Exception if unable to compute a result*/V call() throws Exception;
}

这是Callable接口的定义。

可以看到call方法可以抛出异常或者返回一个值。但是执行端该怎么处理呢?我们一旦起了一个线程,就需要得到返回值,但是这个返回值什么时候返回并不知道,因为是异步的,而且是得到返回值还是捕获了异常也不清楚,所以情况还是比较复杂的。这些都需要进行进一步的封装,也就是Future接口。个人认为,Future接口的存在是为了封装对任务执行情况的获取。主要有:

 boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws InterruptedException, ExecutionException;V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;

因为返回结果不确定何时返回,所以获取是一个阻塞式的操作,只有任务执行完了才返回,否则阻塞。Future接口正式干这个事情的。除了阻塞的get方法外,还有判断知否执行完的方法,相当于提供了一种非阻塞式的获取,我们可以在get前判断一下,如果执行完了再get。调用get时,因为可能爆出异常,所以要用try catch。

所以说Future和Callable是搭配在一起使用的。

使用的方法有两种

第一种,与线程池搭配。
那么在任务执行处就可以接收到一个Future,然后我们可以通过Future来获取结果。

public static void test1(){ExecutorService pool = Executors.newCachedThreadPool();Future<String> result = pool.submit(new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(2000);return "ok";}});try {System.out.println(result.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}

第二种,非线程池。那么也就是使用一个Thread来启动。但是Thread只能接受一个Runnable的接口,而且Runnable执行完start方法以后并不能返回任何值,所以此时应对这种情况,又封装了一个新的类TutureTask,该类同时继承了Future和Runnable接口,所有我们可以把它传给一个Thread,而且还可以通过它来获取返回值。其内部自然会有一个Callable的引用。本质上可以把FutureTask看成是一种扩展了的Runnable接口,内部维护了执行的情况,可以让我们得到返回值。

public static void test2(){FutureTask<String> task = new FutureTask<>(new Callable<String>() {@Overridepublic String call() throws Exception {return "ok";}});Thread t = new Thread(task);t.start();try {System.out.println(task.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}

这样就搞清楚了Callable,Runnable,Future和FutureTask接口的作用。

【Java】Callable 接口相关推荐

  1. java callable 详解_详解Java Callable接口实现多线程的方式

    在Java 1.5以前,创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口.无论我们以怎样的形式实现多线程,都需要调用Thread类中的start方法去向操作系统请求 ...

  2. java callable接口_Java多线程之Callable接口的实现有返回值的线程

    import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util. ...

  3. java callable接口_Java Callable接口

    一 理论 Runnable是执行工作的独立任务,但是不返回任何值.如果我们希望任务完成之后有返回值,可以实现Callable接口.在JavaSE5中引入的Callable是一个具有类型参数的范型,他的 ...

  4. java callable接口_Java Callable接口实现细节详解

    代码如下 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import ja ...

  5. Java Callable接口应用举例

    Runnable是执行工作的独立任务,但是它不返回任何值.在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表的是从方法call()中返回的值,并且必须使用Executo ...

  6. java callable接口_使用Callable接口实现线程

    执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果 package com.gwolf; import java.util.concurrent.Callable; im ...

  7. java.util.concurrent.Callable 接口 源码

    2019独角兽企业重金招聘Python工程师标准>>> 线程池相关 源码: package java.util.concurrent;@FunctionalInterface pub ...

  8. Java多线程之Callable接口的实现

    import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.ut ...

  9. java多线程 -- 创建线程的第三者方式 实现Callable接口

    Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一 ...

  10. 【Java】线程创建方式:Callable接口 / 使用线程池

    面试题:创建多线程有有哪几种方式? 回答:4种. 实现Runnable接口(重写Run方法) 继承Thread类 实现Callable接口(重写Call方法,与Run不同的是,Call方法有返回值) ...

最新文章

  1. 重写了博客上的代码着色脚本
  2. 编java用jdk还是editplus_怎样运用EditPlus进行配置Java编译环境
  3. android数据库格式化,正确格式化SQLite SQL语句
  4. 永磁电机设计唐任远_新能源汽车的关键技术中钕铁硼永磁同步电机结构设计
  5. 尝鲜Ubuntu Server 12.04 LTS
  6. android ndk 多线程mk,NDK开发之Android.mk文件编写
  7. Linux 下升级 python2 到python3
  8. The Tail at Scale
  9. 如何设计第三方账号登陆?
  10. 【Android源代码下载】收集整理android界面UI效果源码
  11. Arduino学习笔记-新的按键控制方式
  12. web前端三大主流框架_web前端三大主流框架
  13. 计算机运算方法与机器指令
  14. Python 和 C++实现 九九乘法表
  15. ubuntu php加载不了gd,ubuntu 中php不支持gd库的freetype,导致页面验证码无法加载
  16. LitePal 数据库使用方法(最新2.0LitePal数据库适用)
  17. Spring源码深度解析
  18. SJCcopula matlab,时变copula的matlab程序
  19. 招银网络Java后端笔试题
  20. 电商项目 java 毕业设计_Java电商毕业设计总结(二)

热门文章

  1. 传感网复习(一)概要、组织结构
  2. 历年英语作文模板解析
  3. Docker入门之安装Docker
  4. 分享 29 款 Chrome 插件,总有一款适合你
  5. 将SVG图像插入到Word中 - Tools
  6. 手机邮箱怎么弄_安卓手机如何接收邮件 教你安卓手机邮箱设置方法
  7. 规划新一年 IT 技术路线?一起来学习下 Gartner 基础设施 Hype Cycle
  8. LSM 树(Log-Structured Merge-Tree) 原理
  9. 数据库领域中最常用的逻辑模型有哪些?请比较各种模型的优缺点并详述。
  10. 浙大版《python程序设计》第四章课后习题