Androidi性能优化之多线程和同步

线程:

  创建线程的方法:

  a:定义Thread类的实例,并start();

  b:实现Runnable接口,并作为参数传给Thread类的实例,然后start();

不管线程是通过什么方式创建的,它都有一个优先级,调度器根据优先级来决定调度执行哪个线程,即让哪个线程使用CPU,调用Thread.setPriority()可以改变线程的优先级。thread.setPriority(Thread.MAX_PRIORITY); //最高优先级(比UI线程高)

  如果未指定优先级,会使用默认值,Thread类定义了三个变量:

  a:MIN_PRIORITY(1)

  b:NORM_PRIORITY(5) -----默认优先级

  C:MAX_PRIORITY(10)

  如果应用设置的线程优先级超出取值范围,也就是说,小于1或大于10,那么会抛出Illegal ArgumentException异常

另一中设置线程优先级的方式是基于Linux优先级,主要参考的是android.os包里的Process.setThreadPriority API。

注意:应该避免混用Thread.setPriority和Process.setThreadPriority,这会使代码一团糟。注意,Linux的优先级从-20(最高)到19(最低),而线程的优先级从1(最低)到10(最高)。

在Android中创建线程并在后台执行非常简单,但更新用户界面比较麻烦:因为view的方法只能在UI线程中调用,所以必须把结果反馈给主线程处理。

AsyncTask:

  很多情况下,应用处理顺序如下:

  a:在UI线程收到事件

  b:在非UI线程中处理相应事件

  c:UI根据处理结果进行刷新

为了简化这个模式,Android 1.5及以上版本定义了AsyncTask类,AsyncTask类可以让应用执行后台操作,并通知UI线程操作结果。为简单起见,对用户隐藏了Thread、Runable以及其他相关对象。

  实际上,doInBackground()调用时机取决于Android版本,Android 1.6之前,任务是串行执行,只需要一个后来线程。从Android 1.6开始,线程池取代了单个的后台线程,线程池允许并行执行多个任务,以提升性能。然而,并行执行多个任务,如果没有正确的同步或者任务执行顺序不符合开发者的预期,那很可能导致严重的问题。因此,Android团队计划在Honeycomb之后恢复到默认情况下只有一个后台线程的模式。

Handler和 Looper

  多线程应用程序通信的基石:Handler 、Looper

数据类型:

  我们知道两种产生线程的方法,使用Thread和AsyncTask类,如果两个或多个线程访问相同的数据,就需要确保数据类型支持并发访问。

同步(Synchronized)、易变(volatile)、内存模型

  如果想在多个线程之间共享对象,但没有实现任何细粒度的锁机制,可以用Synchronized关键字确保数据访问的线性安全。

Java的内存模型:一个线程中变量的修改可能不会立即对其他线程可见。事实上,也许永远不可见。

上一篇:posix thread 浅谈


下一篇:I.MX6 wm8962 0-001a: DC servo timed out