• <output id="56njw"></output>
    1. <dl id="56njw"></dl>

        <dl id="56njw"></dl>

        • 怎样在Android面试中聊聊多线程

          发布:51Code 时间: 2019-07-31 11:32

        • 多线程可以说是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启动时, 它会无限循环尝试从消息队列中获取消息?#36947;? 如果没有消息则会阻塞等待. 当Handler发送消息时会把消息?#36947;?#25918;入消息队列中, Looper从中取得消息?#36947;?#28982;后就会调用Handler的相关方法, 因为Looper是线程绑定的, 如果绑定的是UI线程, 那么此时Handler的方法就会在UI线程中得到执行, 线程间就是这样进行交互的.

          java中的线程

          而Handler机制的底层实现则是使用java多线程相关的类.

          java当中主要使用Thread和Executor来实现多线程. Thread用于直接创建线程, 在Android中也可以直接使用这个类, Looper中就包含一个Thread?#36947;? Executor是一个接口, 大部分java中自带的实现都使用了线程池来管理多线程.

          线程池

          因为在系统中创建线程是一个比较耗费?#35797;?#30340;事, 所以不能频繁创建和释放线程, 因此在效率上考虑通常会使用线程池, 同时也便于线程的管理. Android中的AsyncTask就使用了线程池.

          线程安全

          另一个在使用多线程时需要注意的是线程安全的问题, 因为同一进程中的线程可以共享内存, 虽然这种方式效率很高, 但是会导致线程干扰和内存一致性的问题.

          解决这些问题的主要方法是使用Synchronized关键字来加锁. 基本原理就是线程要对对象进行操作前需要?#28982;?#21462;锁, 如果一个线程正在操作某个对象, 那?#27492;?#23601;会持有相应的锁, 后来的线程想要操作这个对象, 只能等待前面的线程释放锁之后才有机会获取锁并进行操作.

          死锁和活锁

          引入锁之后仍有可能出现一些问题, 例如死锁, 饥饿(Starvation)和活锁.

          多线程工具包

          同时java还提供不少工具来使用多线程, 例如刚刚提到的Executor, 另外常用的还有线程安全的集合, 例如ConcurrentMap, 可以用来避免内存一致性的问题.

          文章来源?#21644;?#32476; 版权归原作者所有
          如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8103),我们将立?#21019;?#29702;。
        • 上一篇:Android防护相关知识点扫盲

          下一篇?#22909;?#26377;了

        网站导航
        Copyright(C)51Code软件开发网 2003-2019 , 沪ICP备05003035号-6
        凤凰时时彩平台

      1. <output id="56njw"></output>
        1. <dl id="56njw"></dl>

            <dl id="56njw"></dl>

          1. <output id="56njw"></output>
            1. <dl id="56njw"></dl>

                <dl id="56njw"></dl>

                澳洲幸运10开奖结果走势图 北京pk拾赢遍天下手机下载 重庆时时五星走综合图 今天20选5开奖号码 cmd体育平台有信用网吗 陕西体彩11选五走势图彩吧助手 秒速时时时彩开奖 pk10官网开奖直播 呼和浩特按摩小姐 胜负彩今日专家推荐