第2章 Android多线程.docx_第1页
第2章 Android多线程.docx_第2页
第2章 Android多线程.docx_第3页
第2章 Android多线程.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

26、进程的概念:一般可以在同一时间内执行多个程序的操作系统都有进程的概念。一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源。在进程的概念中,每一个进程的内部数据和状态都是完全独立的27、线程的概念:多线程指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。线程机制支持并发程序设计,在多处理器系统上,它也能保证真正的并行处理。多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行。同类的多个线程共享一块内存空间和一组系统资源。28、进程与线程的关系:线程与进程相似,都是是一段完成某个特定功能的代码,是程序中单个顺序的流控制。但与进程不同的是,同类的多个线程共享一块内存空间和一组系统资源,所以系统在各个线程之间切换时,资源占用要比进程小得多,正因如此,线程也被称为轻量级进程。一个进程中可以包含多个线程29、多线程和多进程相比,线程之间的通信比进程之间的通信更容易。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进 行,这种方式不仅费时,而且很不方便。但是对于多线程之间可以直接共享数据,比如最简单的方式就是共享全局变量。但是必须注意同步30、多线程同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性31、 线程同步的方式和机制:(1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。(2)互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。(3)信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目(4)事 件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作32、 Linux多线程:Linux实现线程的机制非常独特。从内核的角度来说,它并没有线程这个概念。Linux的线程都当作进程来实现。内核并没有准备特别的调度算法或定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯一隶属于自己的task_struct,所以在内核中,它看起来就像是一个普通的进程(只是该进程和其他一些进程共享某些资源,如地址空间)。常常把线程称作轻量级进程。Linux下以“进程”为调度单位。33、 Windows多线程:(1)Windows系统在内核中提供了专门支持线程的机制。(2)Windows不存在“进程调度”,只有“线程调度”,这是最基本的调度方式。(3)Windows下,任何一个进程都至少有一个线程,main函数会自动成为主线程的函数34、 当一个程序第一次启动时,Android会同时启动一个对应的主线程,主线程主要负责处理与UI相关的事件,主线程通常又被叫做UI线程。36、在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的,并且这些操作必须在UI线程中执行。37、单线程模型所有的任务都在同一个线程中执行。如果执行一些耗时的操作,会阻塞整个用户界面,甚至导致用户界面失去响应。如果阻塞应用程序的时间过长(5秒钟)Android会向用户提示一些信息,即打开一个“应用程序没有相应(application not responding)”ANR 的对话框。解决方法:将耗时的处理过程转移到子线程上,这样可以避免负责界面更新的主线程无法处理界面事件,从而避免用户界面长时间失去响应。38、线程调度是值按照特定的机制为多个线程分配CPU的使用权。调度的模式有两种:分时调度和抢占式调度。n 分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;n 抢占式调度是根据线程的优先级别来获取CPU的使用权。39线程状态:新建状态(New):新创建了一个线程对象。就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期40、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:n 等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。n 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。n 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。41、 Thread的四个构造函数:Thread( ) 、Thread( Runnable runnable ) 、Thread( Runnable runnable, String threadName ) 、Thread(String threadName) 42、 线程实现43、 1、扩展Thread类(1)实现并启动线程:自定义一个类,使其扩展于Thread类,重写run()方法,该方法是必须实现的,用于完成具体的任务。实例化线程对象,使用start()方法启动线程。(2)实例演示(Thred_ticket1)。(3)结果:各线程依次运行,不是并行运行。(4)原因:线程一直占用CPU时间。线程休眠:目的:使线程让出CPU的最简单的做法之一,线程休眠时候,会将CPU资源交给其他线程,以便能轮换执行,当休眠一定时间后,线程会苏醒,进入准备状态等待执行。方法:Thread.sleep(long millis) 和Thread.sleep(long millis, int nanos) ,均为静态方法。哪个线程调用sleep,就休眠哪个线程。(5)修改:加入线程休眠,即sleep()方法。(6)实例演示(Thred_ticket1)。(7)结果:各线程并行运行。44、实现Runnable接口(1)实现并启动线程自定义一个类,使其继承于Runnable接口,重写run()方法,该方法是必须实现的,用于完成具体的任务。实例化Runnable对象,将Runnable对象传入Thread的构造方法,使用start()方法启动新线程。(2)实例演示(Thred_ticket2)。(3)结果:各线程并行运行。45、Thread与Runnable区别Runnable的作用和Thread基本相同,都是用于定义一个线程,但两者本质上有重要区别。(1) Runnable只是一个接口,其内部没有定义任何已实现的方法。因此,要使用与线程有关的方法,只能使用Thread的静态方法,比如:不能直接调用sleep(),而要调用Thread.sleep()方法。(2)定义一个Thread对象,就意味着创建了一个新线程,而定义一个Runnable对象,只是定义了一个可以当作线程运行的代码对象,并没有创建新线程。因此,如果调用Runnable对象的run()方法,仅相当于把Runnable对象当作普通类对象进行调用,并没有启动一个新线程,Runnable对象和调用者在同一个线程中运行。(3)如果要创建一个新线程,则还需要将Runnable对象传入Thread的构造方法,从而创建一个新线程,新线程的执行码就是Runnable所定义的。 Thread与Runnable联系l public class Thread extends Object implements Runnable() l 说明Thread类是Runnable的一个子类。46、 发送接收消息:(1)android的消息处理的核心类l Looper:每个线程只有一个Looper,它负责管理MessageQueue,会不断的从MessageQueue中取出消息,并将消息分给对应的Handler处理。l Handler:它能把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的信息。l Message:Handler接收和处理的消息对象。l MessageQueue:由Looper负责管理。它采用先进先出的方式来管理Message。被封装到Looper里面了,我们不会直接与它打交道l Message用法l 尽管Message有public的默认构造方法,但是应该通过Message.obtain()来从消息池中获得空消息对象,以节省资源。l 如果message只需要携带简单的int信息,请优先使用Message.arg1和Message.arg2来传递信息,这比用Bundle更省内存。l 用message.what来标识信息,以便用不同方式处理message。l (2)Looper线程l 是循环工作的线程。在程序开发中(尤其是GUI开发中),经常会需要一个线程不断循环,一旦有新任务则执行,执行完继续等待下一个任务。l 使用Looper类创建Looper线程。public class LooperThread extends Thread Override public void run() Looper.prepare(); / 将当前线程初始化为Looper线程 handler1 = new Handler(); / 实例化handler handler2 = new Handler(); / 实例化handler / .其它处理 Looper.loop(); / 开始循环处理消息队列 47、Looper.prepare():将当前线程初始化为Looper线程。Looper.loop():调用loop方法后,Looper线程就开始真正工作了,它不断从自己的MQ中取出队头的消息(也叫任务)执行*一个线程可以有多个Handler,但是只能有一个Looper。*UI线程在启动时已经自动初始化了一个Looper。#*其它常用Looper方法:myLooper():得到当前线程looper对象。getThread():得到looper对象所属线程。quit():结束looper循环48、Handler发送消息常用方法:post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long) sendMessageDelayed(Message, long)*handler可以在任意线程发送消息,这些消息会被添加到关联的MQ上Handler处理消息常用方法:dispatchMessage(Message msg)、 handleMessage(Message msg)handler是在它关联的looper线程中处理消息的49、android只允许UI线程更新Activity中的UI组件,新启动的非UI线程不能更新UI组件。方法1:利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。方法2:子线程定时向UI线程发送消息,通知UI线程更新UI组件50、定时器实例实现:按“开始”按钮启动定时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论