上篇文章一直在描述从宏观和微观两个角度来看线程,从线程产生的原因,遇到的问题,如何解决死锁等问题,但是身为一个 Android 移动开发,学习多线程并发对我有什么好处?只是学习了API的使用,或者为了和别人吹吹牛吗?我想应用起来,那么我就在思考下面三个问题。
- 32和64 位的Android机器在使用Long 类型是否会有原子性并发问题
- 多个异步网络请求,是否可以设置优先级
- 启动速度优化,异步耗时依赖并且并发执行如何解决
32位的Android机器在使用Long 类型是否会有原子性并发问题
32位的机器,应该Long 为64位,存在高低32 位的情况,如果并发执行Long类型,在线程切换的时候会出现因为原子性产生的线程并发问题,所以32的Android 对共享变量 Long需要小心并发问题。
同一域名下多个异步网络请求,是否可以设置优先级
应用启动的时候,由于页面复杂,会发起十几个网络请求,比如Okhttp 同一个域名默认是五个,可以设置为默认20,但是不支持优先级,所以可以通过有线队列来实现,如果要是新增一个网络请求可以进行优先级的排序,对于已经发起的网络请求可以不用取消即可。
启动速度优化,异步耗时依赖并且并发执行如何解决
因为app 启动的时候,有许多三方sdk 需要初始化,因为会阻塞主线程,我们第一个想到的就是全部异步初始化,但是各种sdk 和业务代码有依赖关系,我们需要得到对应的结果,所以我们可以采用线程包里边的Future 可以返回对应结果形成依赖关系,并且通过有向无环图来实现,还有的情况需要实现 CountDownLanch 来实现多个线程同时完成的效果,我们一般就处理好启动的优化了。
对于Java 多线程对于 Android 的应用我这里就说这么多,也是结合项目中的优化来说的,如果有任何疑问可以提出,一起商讨!!