Callable的简单使用

Java  2018年5月27日 am10:53发布7年前 (2018)更新 91es.com站长
119 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.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

Vim模式切换命令

前言简单记录一下 Vim命令的 AIO(或aio)的使用正文a和A的命令使用a或A是append(追加)的缩写,进入编辑状态。a : 在[光标位置之后的一个位置]开始操作A : 在[光标位置的行尾]开始开始操作i和I的命令使用i或I是 insert(插入)的缩写,进入编辑状态。...

林清玄 :其实生活都一样,看你怎么想

住在维琴尼亚州的美国朋友,是一位电力工程师,有一天他告诉我一个故事。他被通知到维琴尼亚山上的电塔修理电力障碍,于是清晨就出发了。电塔在很远的山上,开车八小时才抵达那座山,在山里绕来绕去,就是找不到那座电塔,天色逐渐暗下来,终至完全黑暗,伸手不见五指。山上既没有人家,也没有灯火,他心里愈来愈着急,...

个人常用ADB命令总结

获取Android系统版本adb shell getprop ro.build.version.release获取IP地址adb shell ifconfig | grep Mask获取屏幕密度adb shell wm density//修改density 后面直接带值即可ad...

ViewPager出现pointerIndex out of range

前言ViewPager展示图片时,对图片操作时出现如下异常AndroidRuntime: FATAL EXCEPTION: mainAndroidRuntime: Process: com.biumall.image, PID: 17729AndroidRuntime: java.lang...

贾平凹:每个生命都有自己的光芒

一个家庭组合十年,爱情就老了,剩下的只是日子,日子里只是孩子,把鸡毛当令箭,不该激动的事激动,别人不夸自家夸。全不顾你的厌烦和疲劳,没句号地要说下去。我曾经问过许多人,你知道你娘的名字吗?回答是必然的。知道你奶奶的名字吗?一半人点头。知道你老奶奶的名字吗?几乎无人肯定。我就想,真可怜,人过四代,就...

乔叶:比明天年轻

常常听到有人叹息着说:“我比昨天又衰老了一天。”我想,他为什么不说自己还比明天年轻了一天呢?和许多人一样,小时候我一直想的是明天会比今天更接近长大,这多么好。现在我已经长大了,才知道长大并不仅仅是长大,同时也意味着衰老。然而知道了这个又有什么用呢?即使让我从小时候重新来过,我一样也得长大和衰老。但...