前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android十八章:Java线程中的Runnable,Callable,Future,FutureTask

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

作者头像
ppjun
发布2018-09-05 11:51:35
9720
发布2018-09-05 11:51:35
举报
文章被收录于专栏:ppjun专栏ppjun专栏

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

Runnable

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

代码语言:javascript
复制
public interface Runnable{
  public abstract void run();
}

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

代码语言:javascript
复制
new Thread(new Runnable(){
  public void run(){
  // 
 }
}).start();

Callable

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

代码语言:javascript
复制
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
复制
public interface Future<V>{
  boolean isCancelled();
  boolean isDone();
  V get() throws InterputeredException,ExecutionExeception;
  V get(long timeout ,TimeUnit unit)throws InterputeredException,ExecutionExeception,TimeoutExeception;
  
}

比如

代码语言:javascript
复制
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
复制
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
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Runnable
  • Callable
  • Future
  • FutureTask
  • 总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档