Androidi性能优化之多线程和同步-阿里云开发者社区

开发者社区> 最美的回忆> 正文

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的内存模型:一个线程中变量的修改可能不会立即对其他线程可见。事实上,也许永远不可见。

本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/3649519.html如需转载请自行联系原作者


demoblog

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
java多线程 -- 同步鎖
为了解决多线程安全问题在 Java 5.0 之前,协调共享对象的访问时可以使用的机制只有 synchronized 和 volatile 。Java 5.0 后增加了一些新的机制,但并不是一种替代内置锁的方法,而是当内置锁不适用时,作为一种可选择的高级功能。
613 0
Spring MVC 基于阻塞队列 LinkedBlockingQueue 的同步长轮询功能实现
标题 Spring MVC 基于阻塞队列 LinkedBlockingQueue 的同步长轮询功能实现,其实本文介绍的也是生产者消费者的一种实现。生产者不必是一个始终在执行的线程,它可以是一个接口,接受客户端的请求,向队列中插入消息;消费者也不必是一个始终在执行的线程,它同样也可以是一个接口,接受客户端的请求,从队列中取出属于自己的消息;看到很多介绍生产者消息者实现的文章,实现场景都很简单,现实应用往往会比较复杂,有一些附加条件,本例中就需要根据消息中的 familyId 来判断消息是不是下发给自己的。
1085 0
c++ 多个线程读一个线程写同步
这种情况一般多个线程读是不需要加锁的。就在写的时候需要加锁。 那么要做的就是让不写的时候,读不受同步限制。让多线程自由的读。 这个时候就要用读写锁 boost已经有读写锁,而c++ 14才有读写锁。
775 0
Java 并发/多线程教程(三)-多线程的开销
        本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获。由于个人水平有限,不对之处还望矫正!     应用程序由单线程到多线程,不仅仅给我带来了便利,同时也也带来了一些开销。
864 0
内核同步机制
内核中用于临界区保护下的互斥机制,它包括自旋锁、原子操作和信号量,三者保证了对临界资源访问的互斥型。 1.1 内核中的互斥机制 1.1.1 自旋锁 自旋锁用在多个CPU系统中。当一个线程在一个CPU上正使用资源,而另一个线程在另一个CPU上正忙等待这个资源的时候,就会用到自旋锁来保护临界资源。
866 0
C#中一道关于线程同步的练习题——模拟多窗口售票
题目:模拟窗口卖票,四个窗口同时对外开放售票,需要按顺序售出。 要求:输出每一张票的售出时间和售出窗口,不能出现票未售出或者被售出多次的情况。 using System; using System.
1316 0
2286
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载