Android高频面试题:该怎样在Android面试中聊聊多线程不被忽悠?

浩浩 等级 293 0 0

Android高频面试题:该怎样在Android面试中聊聊多线程不被忽悠?

多线程可以说是Android面试的高频问题了,而多线程涉及的内容非常多,因此在面试当中往往不知道从何说起,本文并不是为了科普多线程或者研究多线程的知识,而是尝试组织语言以便在面试当中更好地忽悠面试官。

语言表达在面试当中虽说很重要, 不过更重要的还是相关知识技能过硬。

假如在一场Android面试当中,面试官让你聊聊多线程,你可以试试这样回答。

Android中的线程

在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(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。

还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

收藏
评论区

相关推荐

Android Handler消息机制源码解析
好记性不如烂笔头,今天来分析一下Handler的源码实现 Handler机制是Android系统的基础,是多线程之间切换的基础。下面我们分析一下Handler的源码实现。 Handler消息机制有4个类合作完成,分别是Handler,MessageQueue,Looper,Message Handler : 获取消息,发送消息,以及处理消息的类 Mes
Android HandlerThread源码解析
在上一章Handler源码解析文章中,我们知道App的主线程通过Handler机制完成了一个线程的消息循环。那么我们自己也可以新建一个线程,在线程里面创建一个Looper,完成消息循环,可以做一些定时的任务或者写日志的功能。这就是HandlerThread的作用 Android Handler消息机制源码解析(https://www.cnblogs.co
AT大牛带你深度剖析Android 10大开源框架
做了几年的Android开发,也面试过不少公司,被面试过,也面试过不少人,其实Android的技术真的是无边界,不管你做过多牛的项目,不管你多久的经验在Android开发中不可能是停滞不前的,需要不断的学习及总结,否则难以解公关技术问题,下面把我压箱底的视频资料贡献给大家; 一,android视频教程 Android视频教程: 1,Android入门
Android开发 常见异常和解决办法(一)
Android Studio是Android开发的理想工具,但是由于版本的更新和配置的差异,会出现很多问题,下面是以《第一行代码 第二版》为基础进行开发学习可能遇见的一些问题及其解决办法。 1.Android Studio 3.0及以上版本找不到Android Device Monitor: 解决办法: (1)在Android Studio中打开终端,如下
Android 自学必备网站
一,Android 自学网站给 Android 自学者朋友推荐几个自学网站:1. Android Developers作为一个Android开发者,官网的资料当然不可错过,从设计,培训,指南,文档,都不应该错过,在以后的学习过程中慢慢理解体会。网站:https://developer.android.com/2. Android专业中文社区Android专业
Android系统启动流程(一)解析init进程启动过程
作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。"tag: Android框架层 Android系统启动categories: Android框架层本文首发于微信公众号「刘望舒」
记住几种出现内存泄漏的点
Android 内存优化——常见内存泄露及优化方案如果一个无用对象(不需要再使用的对象)仍然被其他对象持有引用,造成该对象无法被系统回收,以致该对象在堆中所占用的内存单元无法被释放而造成内存空间浪费,这中情况就是内存泄露。在Android 开发中,一些不好的编程习惯会导致我们的开发的app 存在内存泄露的情况。下面介绍一些在Android 开发中常见的内存泄
Android AOSP基础(一)VirtualBox 安装 Ubuntu
AOSP基础 Android框架层本文首发于微信公众号「刘望舒」 前言在Android进阶三部曲第二部《Android进阶解密》的第一章,我介绍了两种阅读源码的方式,其中一种是从百度网盘:https://pan.baidu.com/s/1ngsZs 将源码下载下来,然后用SouceInsight来查看,这种方式很便捷,适合去阅读源码,但是有两个弊端,一个是无
Android AOSP基础(三)Android系统源码的整编和单编
AOSP基础 Android框架层本文首发于微信公众号「刘望舒」 前言在上一篇文章中,我们顺利的将AOSP下载了下来,很多时候我们不仅仅需要去查看源码,还有以下的几个需求: 动态调试Android系统源码 定制Android系统 将最新版本的Android系统刷入到自己的Android设备中 将系统源码导入到Android Studio中为了实现这些需求,就
Android深入理解JNI(一)JNI原理与静态、动态注册
Android框架层 Android深入理解JNI Android框架层本文首发于微信公众号「刘望舒」 前言JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层。这一个系列我们来一起深入学习JNI。<!more 1.JNI概述Android系统按语言来划分的
Android深入四大组件(一)应用程序启动过程(前篇)
Android框架层 Android深入四大组件categories: Android框架层本文首发于微信公众号「后厂技术官」 前言在此前的文章中,我讲过了Android系统启动流程和Android应用进程启动过程,这一篇顺理成章来学习Android 7.0的应用程序的启动过程。分析应用程序的启动过程其实就是分析根Activity的启动过程。<!more 1
Android深入四大组件(六)Android8.0 根Activity启动过程(前篇)
Android框架层 Android深入四大组件categories: Android框架层本文首发于微信公众号「刘望舒」 前言在几个月前我写了和这两篇文章,它们都是基于Android 7.0,当我开始阅读Android 8.0源码时发现应用程序(根Activity)启动过程照Android 7.0有了一些变化,因此又写下了本篇文章,本篇文章照此前的文章不仅
Android深入四大组件(七)Android8.0 根Activity启动过程(后篇)
Android框架层 Android深入四大组件categories: Android框架层本文首发于微信公众号「刘望舒」 前言在几个月前我写了和这两篇文章,它们都是基于Android 7.0,当我开始阅读Android 8.0源码时发现应用程序(根Activity)启动过程照Android 7.0有了一些变化,因此又写下了本篇文章,本篇文章照此前的文章不仅
Android输入系统(二)IMS的启动过程和输入事件的处理
Android框架层 Android输入系统 Android框架层本文首发于微信公众号「刘望舒」基于Android 8.1 前言在上一篇文章中,我们学习了IMS的诞生(创建),IMS创建后还会进行启动,这篇文章我们来学习IMS的启动过程和输入事件的处理。 1.IMS的启动过程IMS的创建在SystemServer的startOtherServices方法中,
全靠这份Android知识点PDF大全,月薪30K
第一阶段:Android 基础知识回顾: 回顾Android 开发编程,深入理解Android系统原理和层次结构,深入分析Handler源码和原理; 回顾Java,C/C++,Kotlin、dart 在Android开发中必用的语言,熟悉一下几种语言混淆后的特性; 回顾Android IPC和JNI的底层原理和热更新技术回顾Native开发要点,使用C++结