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

 

 

posted @ 2015-04-15 15:31  马小豆包  阅读(393)  评论(0编辑  收藏  举报