Thread.ppt_第1页
Thread.ppt_第2页
Thread.ppt_第3页
Thread.ppt_第4页
Thread.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

线程 一个线程是一个程序内部的顺序控制流 线程和进程每个进程都有独立的代码和数据空间 进程上下文 进程切换的开销大 线程 轻量的进程 同一类线程共享代码和数据空间 每个线程有独立的运行栈和程序计数器 线程切换的开销小 多进程 在操作系统中 能同时运行多个任务 程序 多线程 在同一应用程序中 有多个顺序流同时执行 线程的概念模型 虚拟的CPU 封装在java lang Thread类中 CPU所执行的代码 传递给Thread类 CPU所处理的数据 传递给Thread类 线程组 线程组是包括了许多线程的对象集 每个线程都属于某个线程组 并且不可更改其所属的线程组 创建时确定 线程可以访问自己所在的线程组 但不能访问本线程组的父类 对线程组的操作就是对线程组中所有线程进行操作 线程体 Java的线程是通过java lang Thread类来实现的 每个线程都是通过某个特定Thread对象的方法run 来完成其操作的 方法run 称为线程体 线程体的构造 publicThread ThreadGroupgroup Runnabletarget Stringname 任何实现接口Runnable的对象都可以作为一个线程的目标对象 构造线程体的2种方法定义一个线程类 它继承类Thread并重写其中的方法run 提供一个实现接口Runnable的类作为线程的目标对象 在初始化一个Thread类或者Thread子类的线程对象时 把目标对象传递给这个线程实例 由该目标对象提供线程体run 通过继承类Thread构造线程体 classSimpleThreadextendsThread publicSimpleThread Stringstr super str publicvoidrun for inti 0 i 10 i System out println i getName try sleep int Math random 1000 catch InterruptedExceptione System out println DONE getName publicclassTwoThreadsTest publicstaticvoidmain Stringargs newSimpleThread First start newSimpleThread Second start 0First0Second1Second1First2First2Second3Second3First4First4Second5First5Second6Second 6First7First7Second8Second9Second8FirstDONE Second9FirstDONE First 通过接口构造线程体 publicclassClockextendsjava applet AppletimplementsRunnable ThreadclockThread publicvoidstart if clockThread null clockThread newThread this Clock clockThread start publicvoidrun while clockThread null repaint try clockThread sleep 1000 catch InterruptedExceptione publicvoidpaint Graphicsg Datenow newDate g drawString now getHours now getMinutes now getSeconds 5 10 publicvoidstop clockThread stop clockThread null 两种方法的比较 使用Runnable接口可以将CPU 代码和数据分开 形成清晰的模型 还可以从其他类继承 保持程序风格的一致性 直接继承Thread类不能再从其他类继承 编写简单 可以直接操纵线程 无需使用Thread currentThread 线程的状态 创建状态 newThread ThreadmyThread newMyThreadClass 可运行状态 Runnable ThreadmyThread newMyThreadClass myThread start 满足一定的调度条件时 进入Running状态 不可运行状态 NotRunnable 调用了sleep 方法 调用了suspend 方法 为等候一个条件变量 线程调用wait 方法 输入输出流中发生线程阻塞 死亡状态 Dead 线程的终止一般可通过两种方法实现 自然撤消 线程执行完 或是被停止 调用stop 方法 线程的调度 Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程 线程调度器按照线程的优先级决定应调度哪些线程来执行 setPriority int 方法设置优先级Thread类定义了十个线程优先级 MIN PRIORITY NORM PRIORITY MAX PRIORITY每个优先级都有一个等待池 下面几种情况下 当前线程会放弃CPU 线程调用了yield suspend 或sleep 方法主动放弃 由于当前线程进行I O访问 外存读写 等待用户输入等操作 导致线程阻塞 为等候一个条件变量 线程调用wait 方法 抢先式系统下 有高优先级的线程参与调度 时间片方式下 当前时间片用完 有同优先级的线程参与调度 线程的优先级 线程的优先级用数字来表示 范围从1到10 即Thread MIN PRIORITY到Thread MAX PRIORITY 一个线程的缺省优先级是5 即Thread NORM PRIORITY intgetPriority voidsetPriority intnewPriority classThreadTest publicstaticvoidmain Stringargs Threadt1 newMyThread T1 t1 setPriority Thread MIN PRIORITY t1 start Threadt2 newMyThread T2 t2 setPriority Thread MAX PRIORITY t2 start Threadt3 newMyThread T3 t3 setPriority Thread MAX PRIORITY t3 start classMyThreadextendsThread Stringmessage MyThread Stringmessage this message message publicvoidrun for inti 0 i 3 i System out println message getPriority 运行结果 T210T210T210T310T310T310T11T11T11 注意 并不是在所有系统中运行Java程序时都采用时间片策略调度线程 所以一个线程在空闲时应该主动放弃CPU 以使其他同优先级和低优先级的线程得到执行 基本的线程控制 终止线程线程执行完其run 方法后 会自然终止 通过调用线程的实例方法stop 来终止线程 测试线程状态可以通过Thread中的isAlive 方法来获取线程是否处于活动状态 线程由start 方法启动后 直到其被终止之间的任何时刻 都处于 Alive 状态 线程的暂停和恢复sleep 方法suspend 和resume 可以由线程自身调用suspend 方法暂停自己 也可以由其它线程调用suspend 方法暂停其执行 但是要恢复由suspend 方法挂起的线程 只能由其它线程来调用resume 方法 join 方法主线程 subThread join 主线程将子线程合并到主线程中去 又变成了单个线程join longtime 仅合并time时间 之后又变成多线程 多线程的互斥与同步 临界资源问题classstack intidx 0 char data newchar 6 publicvoidpush charc data idx c idx publiccharpop idx returndata idx 两个线程A和B在同时使用Stack的同一个实例对象 A正在往堆栈里push一个数据 B则要从堆栈中pop一个数据 1 操作之前data p q idx 22 A执行push中的第一个语句 将r推入堆栈 data p q r idx 2 3 A还未执行idx 语句 A的执行被B中断 B执行pop方法 返回q data p q r idx 14 A继续执行push的第二个语句 data p q r idx 2最后的结果相当于r没有入栈 产生这种问题的原因在于对共享数据访问的操作的不完整性 在Java语言中 引入了对象互斥锁的概念 来保证共享数据操作的完整性 每个对象都对应于一个可称为 互斥锁 的标记 这个标记用来保证在任一时刻 只能有一个线程访问该对象 关键字synchronized来与对象的互斥锁联系 当某个对象用synchronized修饰时 表明该对象在任一时刻只能由一个线程访问 publicvoidpush charc synchronized this data idx c idx publiccharpop synchronized this idx returndata idx synchronized除了象上面讲的放在对象前面限制一段代码的执行外 还可以放在方法声明中 表示整个方法为同步方法 publicsynchronizedvoidpush charc 如果synchronized用在类声明中 则表明该类中的所有方法都是synchronized的 多线程的通信 classSyncStack privateintindex 0 privatechar buffer newchar 6 publicsynchronizedvoidpush charc while index buffer length try this wait catch InterruptedExceptione this notify buffer index c index publicsynchronizedcharpop while index 0 try this wait catch InterruptedExceptione this notify index returnbuffer index 生产者 消费者问题 classProducerimplementsRunnable SyncStacktheStack publicProducer SyncStacks theStack s publicvoidrun charc for inti 0 i 20 i c char Math random 26 A theStack push c System out println Produced c try Thread sleep int Math random 100 catch InterruptedExceptione classConsumerimplementsRunnable SyncStacktheStack publicConsumer SyncStacks theStack s publicvoidrun charc for inti 0 i 20 i c theStack pop System out println Consumed c try Thread sleep int Math random 1000 catch InterruptedExceptione publ

温馨提示

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

评论

0/150

提交评论