Android学习之——并发编程:Android进程中的线程

来源:互联网 发布:suse12 网络配置 编辑:程序博客网 时间:2024/06/04 08:23
前言:
        AsyncTask和ContentProvider相结合的功能会很强大,可以使用各种常见的应用架构。几乎在所有的MVC模式中,视图(View)对模型(Model)的轮询,都可以通过这种方式实现。
在需要模型把变化推送给视图或者模型是长期持续运行的架构的应用中,采用AsyncTask可能是不够的。
线程约束:
        和Android框架结合起来,用来解决并发问题的另一种安全的简化方式。可以称之为线程约束(thread confinement).
        假设线程DBMinder创建一个对象,并且在一段时间后修改该对象。当DBMinder完成其工作后,需要把该对象传递给另一个线程DBViewer作进一步处理。采用线程约束的方式来实现,DBMinder和DBViewer间必须存在共享区(drop point)和关联锁。过程如下:
        1. DBMinder获得锁,在共享区保存对对象的引用。
        2. DBMinder删除其所有该对象的引用!
        3. DBMinder释放该锁。
        4. DBViewer获得锁,注意到在共享区存在一个对象引用。
        5. DBViewer从共享区恢复该引用,然后清空共享区。
        6. DBViewer释放该锁。

        该过程适用于任何对象,无论对象本身是否是线程安全的。因为在多个线程之间共享的唯一状态是这个共享区。两个线程在访问之前都正确地获取了锁。当DBMinder处理完一个对象时,它把该对象传递给DBViewer,不再保存引用。因此锁传递的对象的状态永远不会再多个线程之间共享。

        线程约束是非常强大的手段。实现时,通常通过有序的任务队列实现共享区。可能会有多个线程竞争该锁,但是每个线程只保留把任务插入队列的时间。
        一个或多个工作线程从队列中删除任务用于执行。这种模式也称为“生产者/消费者模型”。只要一个工作单元可以完全在其所在的工作线程上下文中处理,就不需要进一步执行同步。AsyncTask的工作模式也是如此。
线程约束的作用:
        线程约束很有用,所以Android把它包含进了框架中,放在Looper类中。当执行Looper初始化时,Java线程会把它转成任务队列。它的整个生命周期就是从本地队列中删除对象,执行它们。其他线程执行队列插入工作,正如之前所描述的,交给初始化线程执行。只要执行插入队列的线程删除其入队列的对象的所有引用,那么两个线程就都可以继续执行代码,不需要进一步考虑并发问题。极大的简化了如何正确编程,还消除了由于广泛的同步可能带来的效率低下的问题。
Android中的线程约束:
        Android 的UI实际上就是一个Looper。当启动Context时,系统执行一些记录工作,然后把初始化线程作为Looper启动执行。该线程会成为服务的主线程,即activity的UI线程。
        在activity中,UI框架保存该线程的引用,其任务队列变成UI事件队列。所有的外部驱动器、屏幕、键盘及呼叫处理器等操作都插入到该队列。
        Looper的另一部分工作是作为Handler。在Looper线程上创建的Handler,提供到Looper队列的入口。当Looper线程允许其他入队线程访问其任务队列时,它就创建一个新的Handler,把它传递给其他线程。Handler提供了一些快捷的使用方式使得使用其变得更加简单:View.post(Runnable)、View.postDelayed(Runnbale, long) 和 Activity.runOnUiThread(Runnable)。




Mr.傅:学习笔记
欢迎转载,转载注明出处,谢谢
《Android程序设计》
引用说明:Programming Android by Zigurd Mednieks, Laird Dornin, G.Blake Meike, and Masumi Nakamura. Copyright 2011 O'Reilly Media, Inc., 978-1-449-38969-7


0 0
原创粉丝点击