《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 (切换到另一个线程)。