×
广告

【Android那些高逼格的写法】Callable与 Future

96
mymdeep
2018.04.18 14:31 字数 977

该文章转自mymdeep的公众号,公众号二维码在文章结尾,感兴趣的朋友可以关注一下。

最近在看一些代码的时候,发现许多android的开发者其实对java了解的并不是很多,也许你看过很多android相关的书籍,但是书中只会告诉你android相关的接口怎么用,但是不会给你讲java的语法,虽然功能都能实现,但是有些语法让你用起来,更显逼格。

所以我开了这样一个专题【Android那些高逼格的写法】

ps:关于WiFi的专题还没写完,又在给自己挖坑了。

言归正传,开始了。

Callable和Future

Callable接口类似于Runnable,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到。

先说一个场景,比如,我需要两个字符串,这两个字符串都需要通过请求获取。我们一般的操作是,起一个异步线程,在异步线程中做两次请求,获取两个字符串,并进行处理。假设一次请求的时间是1s,那么处理两个字符串的时间就是2s。那如果我需要多次请求的结果呢,比如100次,那么就需要100s,这显然不太合理。

这时候就可以使用Callable与FutureTask进行配合,启动100个线程(当然启动100个线程也不合理,这里只是假设,正常情况交给设定线程数的线程池处理)。你可能会说,这样线程就不同步了,你怎么知道,第一个线程结束后,第二个线程肯定结束了,可能出了意外,没有返回呢,没关系,这就是Callable+Future的用处。

好了下面说一下用法:

image.png

Callable + Future

首先我会写模拟两个网络请求(真实网络不可控,就写个方法假设进行了网络请求吧):

image

为了方便对比,我就不设置100次了,就按照十次算就好了:

image

我做了个计时操作,看一下耗时。

Callable + FutureTask

FutureTask的用法与Future类似,这里也上一个例子:

image

结果对比

为了做出对比,我再写一个如果按顺序进行网络请求的例子。

image

好的,我们运行一下看看结果:

image

结果已经很明显了,顺序执行的当然要慢于并发执行。同时使用Callable还解决了并发执行时间不好控制的问题。

这是为什么呢?

为什么每次调用future.get()正好网络请求会完成呢,如果没完成怎么办。

答,会等待,当我们利用future获取callable的返回结果时,如果get不到,还没有完成,会处于等待的状态,等拿到结果再调用下一个future的get,如果耗时差不多,一般也都完了,没完的就会再等。由于是并发执行,所以最终耗时与线程耗时最长的一样。

掌握这种方法对于多线程处理,又想进行一定的控制,有很好的疗效。

不知道你在你的代码中用过没有?

热门推荐

各类仿客户端源码大云集
1G+ Android学习视频大放送
6000套android源码直接放送

一起分享技术的点滴,关注公众号加入我们吧。

image
开发随笔
Web note ad 1