在Android当中, 当应用启动的时候,系统会给应用分配一个进程,顺便一提, 大部分应用都是单进程的,不过也可以通过设置来使不同组件运行在不同的进程中,在创建进程的同时会创建一个线程,应用的大部分操作都会在这个线程中运行,所以称为主线程,同时所有的UI控件相关的操作也要求在这个线程中操作,所以也称为UI线程。
UI线程和工作线程
因为所有的UI控件的操作都在UI线程中执行,如果在UI线程中执行耗时操作,例如网络请求等,就会阻塞UI线程,导致系统报ANR(Application Not Response)错误。因此对于耗时操作需要创建工作线程来执行而不能直接在UI线程中执行。这样就需要在应用中使用多线程,但是Android提供的UI工具包并不是线程安全的,也就是说不能直接在工作线程中访问UI控件,否则会导致不能预测的问题,因此需要额外的机制来进行线程交互,主要是让其他线程可以访问UI线程。
线程交互 - Handler机制
在Android当中,工作线程主要通过Handler机制来访问UI线程。当然还有一些封装好的类例如AsyncTask可以使用,但是本质仍是使用Handler。
Handler机制主要由4部分组成,Looper,消息队列,消息类和Handler组成,其中Looper和消息队列是和线程绑定的,每个线程只会有一个Looper和一个消息队列,当Looper启动时,它会无限循环尝试从消息队列中获取消息实例,如果没有消息则会阻塞等待。当Handler发送消息时会把消息实例放入消息队列中,Looper从中取得消息实例然后就会调用Handler的相关方法,因为Looper是线程绑定的,如果绑定的是UI线程,那么此时Handler的方法就会在UI线程中得到执行,线程间就是这样进行交互的。
java中的线程
而Handler机制的底层实现则是使用java多线程相关的类。
java当中主要使用Thread和Executor来实现多线程。Thread用于直接创建线程,在Android中也可以直接使用这个类,Looper中就包含一个Thread实例。Executor是一个接口,大部分java中自带的实现都使用了线程池来管理多线程。
线程池
因为在系统中创建线程是一个比较耗费资源的事,所以不能频繁创建和释放线程,因此在效率上考虑通常会使用线程池,同时也便于线程的管理。Android中的AsyncTask就使用了线程池。
线程安全
另一个在使用多线程时需要注意的是线程安全的问题,因为同一进程中的线程可以共享内存,虽然这种方式效率很高,但是会导致线程干扰和内存一致性的问题。
锁
解决这些问题的主要方法是使用Synchronized关键字来加锁。基本原理就是线程要对对象进行操作前需要先获取锁,如果一个线程正在操作某个对象,那么它就会持有相应的锁,后来的线程想要操作这个对象,只能等待前面的线程释放锁之后才有机会获取锁并进行操作。
死锁和活锁
引入锁之后仍有可能出现一些问题,例如死锁,饥饿(Starvation)和活锁。
多线程工具包
同时java还提供不少工具来使用多线程,例如刚刚提到的Executor,另外常用的还有线程安全的集合,例如ConcurrentMap,可以用来避免内存一致性的问题。
如果你是面试官,你被忽悠到了吗?欢迎在讨论区说说你的看法。
最后
以上面试中问到的题目基本上都可以在上面找到答案,所以做准备是很重要的,但技术是一点点积累的,就算你全会背了,面试过了,真正等到工作的时候还是会捉襟见肘的,所以踏实点吧骚年。
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2020BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
领取:【PDF】
Android 基础知识点
Java 基础知识点
总结
现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。
我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。
Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。
如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!**