Callable的简单使用

Java  2018年5月27日 am10:53发布6年前 (2018)更新 91es.com站长
88 0 0

一、Callable的简介

Callable是Java1.5中引入的一个接口,直接看官方文档:

public interface Callable<V>

A task that returns a result and may throw an exception. Implementors define a single method with no arguments called call.The Callable interface is similar to Runnable, in that both are designed for classes whose instances are potentially executed by another thread. A Runnable, however, does not return a result and cannot throw a checked exception.

The Executors class contains utility methods to convert from other common forms to Callable classes.

Since:
1.5

英文比较差,翻译有些“羞涩”,但还是总结为如下三点:

1、有一个无参数的call()方法,有返回值,也会抛出异常

2、Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

3、Callable会返回执行结果和抛出一个checked exception,但是Runnable不会

从上面信息可以看出,Callable是带有返回值的”Runnable“

二、Callable和Runnable的比较

1、相同点

Callable和Runnable都是接口。

2、不同点

1、Callable返回的是V(泛型),也就支持多个类型;Runnable不支持

2、Callable可以抛出checked exception;Runnable不可以

3、Callable执行的方法是call(),并有结果返回;Runnable执行的方法是run(),且不返回结果

4、Callable和Runnable都可以应用于executors,而Thread类只支持Runnable

三、Callable的使用

//测试代码1
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                Thread.sleep(3000); //延迟3秒
                return (int) (Math.random() * 100);
            }
        };

        //FutureTask实现于RunnableFuture,而RunableFuture继承于Runnable和Future
        FutureTask<Integer> futureTask = new FutureTask<>(callable);

        //Thread中只支持Runnable
        new Thread(futureTask).start();

        try {
            //get()会阻塞,直到获取到结果
            Log.d(TAG, "----------random:"+ futureTask.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
//测试代码2
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {

                Thread.sleep(3000);
                return (int) (Math.random() * 100);
            }
        };
        //创建一个单线程
        ExecutorService executorService = Executors.newSingleThreadExecutor();

        Future<Integer> future = executorService.submit(callable);

        try {
            Log.d(TAG, "--------------------random:" + future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        //shut down
        executorService.shutdown();

通过实验可以看出:

1. Callable的call()方法是运行在子线程中

2. Callable不能直接由Thread启动,需要通过FutureTask进一步转换

3. futureTask.get()方法如果没获取到结果,会一直阻塞

4. Executors中通过submit()方法执行Callable;通过execute()执行Runable

 历史上的今天

  1. 2023: Android批量拷贝文件(0条评论)
  2. 2022: [NDK开发]Android JNI 开发之静态注册(0条评论)
  3. 2021: [代码片段]通过pinyin4j实现汉字转拼音(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

Android的编译

前言本文主要是摘抄关于Android的编译。虽然都用过,但偶尔还是记不住。摘抄于此,方便自己查阅。主要涉及make,mm,mmm等。正文在Android源码目录下执行source build/envsetup.sh执行完上面的后lunch 95我这里是加载编译目标为95,具体看你选...

常用Linux命令摘抄之一

推荐使用 读书导航 极客导航 :125啦极客导航(http://www.91es.com/jike.html)1、man man的含义是manual,即手册。当我们不清楚Linux命令作用和用法时, 可以使用man command进行查询,command为具体的命令名称。 ...

JobIntentService的使用

前言简单记录一下JobIntentService的使用,后面高版本又废弃了,推荐使用Android Jetpack了。虽然废弃了,但还是记录一下(之前没记录)。水文一篇,哈哈,大佬们可以跳过。正文Android 8.0对系统资源的管控更加严格,添加了后台限制规则。如果满足以下任意条件...

Binder个人简单总结

前言Binder对于Android开发,很熟悉,也很陌生。我也经常用,但对其原理不是很了解,因此参考其他大佬的,做一下笔记。简单记录一下Android中Binder的原理(其实主要摘抄),方便自己回顾。正文什么是BinderBinder是Android中的一种跨进程通信(IPC)的方式。...

许钦文:花园的一角

荷花池和草地之间有着一株水杨,这树并不很高,也不很大,可是很清秀,一条条的枝叶,有的仰向天空,随风摆宕,笑嘻嘻的似乎很是喜欢阳光的照临;有的俯向水面,随风飘拂,和蔼可亲的似乎时刻想和池水亲吻;横在空中的也很温柔可爱,顺着风势摇动,好像是在招呼人去鉴赏,也像是在招呼一切可爱的生物。在同一池沿,距离这...

ThreadPoolExecutor简单记录

前言线程经常用,线程池也用,但在于如何使用,没有记录一下。本文参考别人文章整理。正文使用线程池的好处降低内存资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。在线程池中的线程都是已经被创建好的,我们的任务直接获取一个空闲的线程就能够被执行了提高线程的可管...