首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android十八章:Java线程中的Runnable,Callable,Future,FutureTask

Android十八章:Java线程中的Runnable,Callable,Future,FutureTask

作者头像
ppjun
发布于 2018-09-05 03:51:35
发布于 2018-09-05 03:51:35
1.1K00
代码可运行
举报
文章被收录于专栏:ppjun专栏ppjun专栏
运行总次数:0
代码可运行

前言,在java线程中最常见的是Thread 和Runnable,很少见到或者用到callable等类。但是,你接触过android源码就会经常看到这些类,比如AsyncTask的源码在execute方法源码可以看到了这些类。在面试时也有可能会问到两者的区别,所以现在容许鄙人来介绍一下java中这些类的用法。

Runnable

Runnable一个接口类,包括一个run的接口方法:通常我们会自定义一个类去实现Runnable,这时候还可以实现其他接口方法,如果类要是继承Thread就不能再继承其他类了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Runnable{
  public abstract void run();
}

Runnable 通常配合Thread使用,在run方法里面写耗时的操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new Thread(new Runnable(){
  public void run(){
  // 
 }
}).start();

Callable

Callable是一个泛型接口,要比Runnable强些 ,因为接口方法call有返回值,并且返回值是传入的泛型类型,还能call的过程中抛出异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Callable<V>{
  V call() throws Exception;
}

示例要配合Future或者FutureTask来执行。

Future

Future是一个泛型接口类,是Runnable和Callable的调度容器,就是对Runnable和Callable的结果进行操作,比如:

  1. isCancelled()取消操作,call方法任务完成前取消,返回true。
  2. isDone()判断是否操作完成,是则返回true。
  3. get()获取操作结果,会导致程序阻塞,必须等到子线程结束才会得到返回值。
  4. get(long timeout TimeUnit unit)在某时间后获取操作结果,如果在规定时间内获取不到返回值将会抛出超时异常)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Future<V>{
  boolean isCancelled();
  boolean isDone();
  V get() throws InterputeredException,ExecutionExeception;
  V get(long timeout ,TimeUnit unit)throws InterputeredException,ExecutionExeception,TimeoutExeception;
  
}

比如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ExecutorService threadPool=Executors.newSingleThreadExecutor();
Future future=threadPool.submit(new Callable<String>(){
  public String call()throws Exception{
    return "result";
  }
  
});

Futurn.get();//返回操作结果

FutureTask

FutureTask类同时实现了Runnable和Future<V> 两个接口,具有了两个接口的属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class FutureTask<V> implements RunnableFuture<V>{
  public FutureTask(Callable<V> callable){
       this.callable=callable;
       ...
     }
  public FutureTask(Runnable runnable,V result){
    this.callable=Executors.callable(runnable,result);
    ...
  }
  boolean isCancelled();
  boolean isDone();
  V get() throws InterputeredException,ExecutionExeception;
  V get(long timeout ,TimeUnit unit)throws InterputeredException,ExecutionExeception,TimeoutExeception;
}
public interface RunnableFuture<V> implements Runnable,Future<V>{
  void run();
}

这里的FutureTask间接实现了两个接口,在FutureTask的构造方法传入Callable或者是Runnable,而Runnable会转为Callable,runnable通过runnableadapter转为callable。同时FutureTask还具备Future的所有方法。

举个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Callable<Integer> callable=new Callable<Integer>(){
  public Ingeter call() throws Exception{
    return 100;
  }
};
FutureTask<Integer> task=new FutureTask<Integer>(callable);
new Thread(task).start();

task.get();//当然要先启动线程才能得到结果;

这里的callable当成runnable用了。

总结

  1. Callable比Runnable高级能返回结果值和抛出异常
  2. 可以有上述例子看到Callable来产生结果,Futuretask来获取结果。
  3. 在获取结果期间还可以控制是否取消thread 判断thread是否完成。
  4. FutureTask调用get方法获取call返回值过程中,主线程会阻塞,直到call方法结束并且返回。 ​
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.02.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Callable/Future 使用及原理分析,Future .get()为啥能等待呢?
Callable/Future 和 Thread 之类的线程构建最大的区别在于,能够很方便的获取线程执行完以后的结果。首先来看一个简单的例子
源码之路
2020/09/04
5K0
Callable/Future 使用及原理分析,Future .get()为啥能等待呢?
多线程 | FutureTask 执行流程
在 Java 中可以用来创建线程的方式很多,比如由 Java 提供的 Thread、Runnable 等。本文章来介绍使用 FutureTask 创建线程,以及其流程。
码农UP2U
2022/04/28
3080
Runnable和Callable源码及应用解析
里面使用Runnable的地方只有传递对象的时候,其他都是使用的Thread而Thread又实现了我们的Runnable,所以Runbale可以理解为执行代码的对象,执行的过程和线程的操作交由Thread控制,Thread源码可以看 ----》Thread源码解析。
余生大大
2022/11/02
2020
Runnable和Callable源码及应用解析
Java中的Runnable、Callable、Future、FutureTask的区别
Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别。
开发者技术前线
2020/11/23
4720
Java并发编程之Future和FutureTask
搞过Java或者客户端Android开发的都知道,创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。不过,这2种方式都有一个缺陷,就是在执行完任务之后无法获取执行结果。
xiangzhihong
2022/11/30
3720
详解多线程启动涉及的知识点
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易地实现资源共享。实现Runnable接口比继承Thread类所具有的优势:
BUG弄潮儿
2022/06/30
2030
详解多线程启动涉及的知识点
Java 还有第三种创建多线程的方式?
我们在多线程编程中最常用的两种方式:一种是直接继承Thread,另外一种就是实现Runnable接口。这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。
互扯程序
2019/06/19
4840
Thread, Runable, Callable 还傻傻分不清?
在java中你怎么创建线程?相信你很快能够想到继承Thread类和实现Runnable接口这两种方式。
Java技术栈
2020/12/21
7610
Thread, Runable, Callable 还傻傻分不清?
(十一) J.U.C-FutureTask
FutureTask是J.U.C中的类,是一个可删除的异步计算类。这个类提供了Future接口的的基本实现,使用相关方法启动和取消计算,查询计算是否完成,并检索计算结果。只有在计算完成时才能使用get方法检索结果;如果计算尚未完成,get方法将会阻塞。一旦计算完成,计算就不能重新启动或取消(除非使用runAndReset方法调用计算)。
用户1212940
2022/04/13
2160
(十一) J.U.C-FutureTask
Future备忘录
Future是一个接口,它的主要目的,是为了我们能够方便的控制在线程中的任务的进度。在实际使用中,它常与Callable一起使用。本文主要为了理清,Java中,线程任务的各种类的关系。
Oceanlong
2019/01/28
3880
创建线程都有哪些方式?— Callable篇
相信大家回答这个问题没什么难度吧?通常问完创建方式,那么接下来就是问「1、2」跟「3」创建方式的不同了,只要说出「3」有返回值基本这个问题就过了,不管是出于好奇还是疑惑,我们今天来会会这个Callable。
niceyoo
2020/07/26
8040
多线程设计模式 - Future模式之JAVA原生实现
JDK内置的Future设计模式主要使用到了Callable接口和FutureTask类。
JAVA日知录
2019/12/02
4040
Java并发编程之Future与FutureTask
我们都知道实现异步可以通过Runnable接口来实现,但是Runnable接口是无法获取任务的返回值的,如果需要获取到任务的返回值,那么就需要利用Future机制了。
科技新语
2025/06/05
850
Java并发编程之Future与FutureTask
Future && FutureTask
线程的创建方式中有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,于是就有了Callable接口,Future接口与FutureTask类的配和取得返回的结果。
大学里的混子
2019/03/13
5550
JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
为什么要是用Callable和Future Runnable的局限性 Executor采用Runnable作为基本的表达形式,虽然Runnable的run方法能够写入日志,写入文件,写入数据库等操作,但是它不能返回一个值,或者抛出一个受检查的异常,有些需要返回值的需求就不能满足了。 能够取消 Executor中的任务有四个状态:创建,提交,开始和完成。如果说有些任务执行时间比较长,希望能够取消该任务,Executor中的任务在未开始前是可以取消的,如果已经开始了,只能通过中断的方式来取消。如果使用Calla
Janti
2018/04/10
9590
JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
Future Java
Future是多线程开发中常见的一种设计模式。Future模式可以返回线程执行结果的契约,通过此契约程序可以选择在合适的时机取回执行的结果,如果取回结果时线程还没有执行完成,将会阻塞调用线程等待执行结果返回。
shysh95
2021/06/10
4320
Future Java
(juc系列)runnable与future等异步设计
Runable接口, 应该由那些想要被线程执行的类来实现.它定义了一个无参数,无返回值的run()方法,负责运行代码段.
呼延十
2021/10/22
2710
Future解析与使用
Java 1.5开始,提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。
林老师带你学编程
2019/05/25
5910
Future FutrueTask Callable类源码说明以及原理使用
  JDK内置的Future主要使用到了Callable接口和FutureTask类。
小勇DW3
2018/08/30
5650
Runnable 和Callable的实现与区别,应用场景
1:通过实现Runnable接口 2:通过继承Thread接口 3:通过Callable和Future创建线程
全栈程序员站长
2022/07/25
1.6K0
相关推荐
Callable/Future 使用及原理分析,Future .get()为啥能等待呢?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档