zoukankan      html  css  js  c++  java
  • 《Android应用性能优化》 第5章 多线程和同步

    1、DDMS中可以看见的系统线程(Andorid3.1的Galaxy Tab 10.1为例):

    main

    HeapWorker    执行finalize函数和引用对象清理

    GC        Garbage Collector垃圾收集

    Signal Catcher   捕捉Linux信号进行处理

    JDWP       Java Debug Wire Protocol 调试协议服务

    Compiler      JIT compiler 即时编译器

    Binder Thread #1  Binder通讯

    Binder Thread #2

    2、Thread

    Thread对象,也就是Java定义的Tread类的实例。是自己带有调用栈的执行单位

    典型错误:调用run(),而不用start()  这会让Thread / 或Runnable对象的run()方法,在当前线程中被调用执行。没有产生新线程

    3、改变线程优先级的方法

    (1)Thread的优先级从1 到10

    Thread.setPriority()可以

    Thread thread = new Thread("thread name"){
    
      @override
    
      public void Runnable(){
    
      }
    
    }
    
    thread.setPriority(Thread.MAX_PRIORITY);//最高优先级 (比UI线程高)
    
    thread.start();

    MIN_PRIORITY(1)

    NORM_PRIORITY(5)——默认优先级,如果未指定优先级,会使用默认优先级

    MAX_PRIORITY(10)

    如果应用设置的线程优先级超出取值范围(1—10),会抛出 IlegalArgumentException异常

    (2)另一种方式是使用android.os 包里的Process.setThreadPriority()

    它基于Linux的优先级,从 -20(最高)到 19(最低)

    定义了8个优先级:

    THREAD_PRIORITY_AUDIO (-16)

    THREAD_PRIORITY_BACKGROUND (10)

    THREAD_PRIORITY_DEFAULT (0)

    THREAD_PRIORITY_DISPLAY (-4)

    THREAD_PRIORITY_FOREGROUND (-2)

    THREAD_PRIORITY_LOWEST (19)

    THREAD_PRIORITY_URGENT_AUDIO (-19)

    THREAD_PRIORITY_URGENT_ DISPLAY (-8)

    还可以使用Process.THREAD_PRIORITY_LESS_FAVORABLE (+1) 和 Process.THREAD_PRIORITY_LESS_FAVORABLE (-1)

    如想把线程优先级设置的比默认高。则可以用(THREAD_PRIORITY_DEFAULT  + THREAD_PRIORITY_LESS_FAVORABLE)

    用这种方式,而不是你直接+1、 -1,是因为+1有时候意味着提高优先级,有时则是降低优先级。

    注:不要混用Thread.setPriority 和 Process.setThreadPriority。因为Thread和Linux中的优先级定义不同。

    注:改变线程优先级必须非常小心。增加优先级可能加快这个线程的人物执行速度,但会对别的线程造成负面影响,影响整体体验。

    可以考虑 优先级老化算法。

    再次强调:后台线程更新用户界面,必须反馈给主线程处理,View的方法只能在UI线程中调用。

    "原子操作(atomic operation)是不需要synchronized",这是Java多线程编程的老生常谈了。

    所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。

    一个操作是原子的(atomic),如果这个操作所处的层(layer)的更高层不能发现其内部实现与结构。
    原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部分。
    视作整体式原子性的核心。

     

  • 相关阅读:
    PHP数组(数组正则表达式、数组、预定义数组)
    面向对象。OOP三大特征:封装,继承,多态。 这个讲的是【封存】
    uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并
    LA4329 Ping pong 树状数组
    HDU 1257 最少拦截系统
    HDU 1260 Tickets
    codeforce 621D
    codeforce 621C Wet Shark and Flowers
    codeforce 621B Wet Shark and Bishops
    codeforce 621A Wet Shark and Odd and Even
  • 原文地址:https://www.cnblogs.com/maxiaodoubao/p/4428729.html
Copyright © 2011-2022 走看看