Android thread

来源:互联网 发布:fashion的网络用语 编辑:程序博客网 时间:2024/06/18 13:16

 本片文章将介绍android的线程相关知识,主要分为三个部分:背景知识、线程种类以及各自的适用场景,文章摘自efficient android threading

一、背景知识

       说到线程,我们首先知道需要讲进程,因为线程属于进程内部的东西,在android中,进程是怎样的设计?进程和应用又有什么样的关系呢?图1

     


如上图所示:从上往下是三个大的层次:应用层、ART层(android run time)、Linux 层。每创建一个应用,都会经过如下步骤:

1、开启一个linux 进程

2、创建runtime 虚拟机

3、创建application 实例

4   创建启动这个应用的入口组件(如activity、service)

进程设置了优先级,这样os才能决定在资源不足时应该舍弃谁,android的优先级设定结合了android的基本组件

Foreground 

application 有一个可见的组件在前台,有一个绑定到service的activity运行在前台的另一个进程中,有broadcast在运行

Visiable

application 有一个部分可见的组件

Service

service在后台运行,未绑定到前台activity中

Background

一个不可见的activity

Empty

没有活跃的组件


     每一个应用外面都包裹着art虚拟机、Linux 进程,运行在Linux os中,进程设置了优先级,方便os对进程进行资源的调度和管理,为了提高用户体验,进程内部开辟了特殊的ui线程,也就是main线程来更新ui,其他耗时操作都应该重新开辟线程

     线程都是从进程中创建的,而且,所有的线程都是linux thread。线程跟进程很想,唯一的差别就是能不能共享资源。linux os层面关心的更多的是线程,而不是进程,不管外在的应用有什么样的形式,在底层就是线程的执行,linux 依赖什么来调度线程呢,线程之间的竞争又是依靠什么,有两个因素:

       priority

   改变线程的优先级

       control group

   改变android指定的cgroup

priority:

       基本上线程创建时,就会从创建它的线程集成它的优先级, 如下图所示。uithread创建的工作线程有着和自己一样的default优先级,反过来还会和自己竞争资源,我们一定要手动设定工作线程的优先级,一般是        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);   

private void init(ThreadGroup g, Runnable target, String name, long stackSize) {    Thread parent = currentThread();    if (g == null) {        g = parent.getThreadGroup();    }    g.addUnstarted();    this.group = g;    this.target = target;    this.priority = parent.getPriority();    this.daemon = parent.isDaemon();    setName(name);    init2(parent);    /* Stash the specified stack size in case the VM cares */    this.stackSize = stackSize;    tid = nextThreadID();}

 control group

    cgroup 主要是方便管理线程,将一组线程放在一起,统一分配一样的执行时间,在android中重要的是两种类型的cgroup:Foreground Group和 Background Group

二者和进程等级对应关系如下:
cgroupprocess rankfgforegroundfgvisibalebgservicebgbackgroundbgempty

  

        二者竞争分配的cpu执行时间如下:
           图2




如果进程在前台,那么它创建的线程都属于fg,会获取更多执行时间,如果按home键,应用切换到后台,那么原来属于fg的线程会变成属于bg。另外,前面我们说的主动降低线程的优先级,也会将此线程放置到bg,尽管有时它创建于前台进程。

二、线程种类

1、handlerthread

    最大特点就是执行任务的顺序性,另外就是handler的特点

容易使用和复用,sendmessage即可

任务容易组成任务链,通过handler的message.what串联起来

任务之间通过handler传递data方便

2、executor

最大特点就是复用线程,通过生产者消费者模型,并发执行多个任务,可以和service结合,能够被多个组件共享调用,生命周期也独立于调用组件,通过intent调用,可跨进程

内部执行:

  1、如果线程个数小于核心,则开启线程执行

  2、如果能够放进阻塞队列,则放入,否则,3

  3、是否超过最大线程数,未超过,则创建,否则4

  4、拒绝

3、intentservice

内部其实是个handlerthread,但是由于是service组件包装,所以提高了优先级,而且独立于启动它的组件的生命周期,handlerthread的适用场景同样也适用于intentservice,有一个特殊场景需要注意,broadcast 的onreceive执行在主线程,当有耗时操作时,需要开启线程,但是onreceive执行完,则broadcast组件生命周期结束,如果这是进程的入口,那么进程会变为一个空进程,很容易被杀死,这时候intentservice就是个很好的选择。

如果任务的执行受控制于客户侧,或者需要并发执行,则建议适用service 内部建立多线程调度的方式


  




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 麦芒5指纹消失了怎么办 华为应用锁密码忘了怎么办 华为麦芒5密码忘了怎么办 华为卡1无服务怎么办 经常卡1无服务怎么办 华为手机进水无服务怎么办 苹果手机进水后无服务怎么办 苹果6进水无服务怎么办 华为手机突然无服务怎么办 sim卡显示无服务怎么办 华为麦芒进水无限开关机怎么办 华为麦芒5进水黑屏怎么办 华为麦芒6进水了怎么办 4g手机开不开机怎么办 全屏钢化膜总是翘边怎么办 华为麦芒屏幕触屏失灵怎么办 华为麦芒5运行慢怎么办 手机屏保密码忘记了怎么办 麦芒5密码锁忘了怎么办 超薄手机壳松了怎么办 华为麦芒5声音小怎么办 笔记本外壳a面裂了怎么办 苹果手机外壳摔坏了怎么办 挂衣服肩膀出包怎么办 摩拜单车手机号注销了怎么办 摩拜单车手机号码换了怎么办 摩拜单车换手机号码打不开怎么办 摩拜单车丢了怎么办 摩拜单车忘锁了怎么办 透明手机壳粘指纹怎么办 tpu手机壳变黄了怎么办 0pp0手机声音小怎么办 橡胶皮套晒坏了怎么办 宝宝晚上吹空调发烧怎么办 玩手机手指尖疼怎么办 手机型号不支持微信运动怎么办 手腕向下压会疼怎么办 手腕韧带拉伤怎么办恢复快 华为手机用车载充电慢怎么办 华为麦芒6充电慢怎么办 oppo手机压弯了怎么办