• 《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)的更高层不能发现其内部实现与结构。
    原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部分。
    视作整体式原子性的核心。

     

  • 相关阅读:
    最多区间覆盖问题
    Luogu2420 让我们异或吧
    高精度计算(三) /*高精度的乘法运算*/
    用canvas画时钟
    Chrome开发者工具学习
    float浮动与清除浮动
    理解css中的position-static elativefixedabsolute
    bootstrap
    cookie与localstorage和sessionstorage的区别比较
    cookie学习
  • 原文地址:https://www.cnblogs.com/maxiaodoubao/p/4428729.html
Copyright © 2020-2023  润新知