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

该文章转自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的用处。

好了下面说一下用法:

Callable + Future

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

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

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

Callable + FutureTask

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

结果对比

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

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

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

这是为什么呢?

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

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

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

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

热门推荐

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值