- 1、本文档共62页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 线程的基本控制 结束线程 当一个线程从run()方法的结尾处返回时,它自动消亡并不能再被运行,可以将其理解为自然死亡 利用stop()方法强制停止,可以将其理解为强迫死亡,这种方法必须用于Thread类的特定实例中 结束线程例 例 11-5 强迫死亡 利用Thread类中的静态方法currentThread()来引用正在运行的线程,见例11-6 在这个例子中,执行stop()将破坏当前的运行环境,因而run()中的循环在此情况下将不再运行 检查线程 isAlive() 获取一个线程是否还在活动状态的信息。 活动状态不意味着这个线程正在执行,而只说明这个线程已被启动,并且既没有运行stop(),也尚未运行完方法run()。 挂起线程 暂停一个线程称为挂起。在挂起之后,必须重新唤醒线程进入运行 挂起线程的方法 sleep() 线程不是休眠期满后就立刻被唤醒,因为此时其他线程能正在执行,重新调度只在以下几种情况下才会发生: 1) 被唤醒的线程具有更高的优先级; 2) 正在执行的线程因为其他原因被阻塞; 3) 程序处于支持时间片的系统中 suspend()和resume() join() :引起现行线程等待,直至方法join所调用的线程结束 程序11-4 suspend()和resume() 程序11-4 说明:线程t在运行到suspend()以后被强制挂起,暂停运行,直到主线程调用t.resume()时才被重新唤醒 ; 一个线程只能被不同于它自身的线程所唤醒,因为在执行suspend()方法以后,这个线程其后的代码都不会被执行到,而该线程又依赖于其后的resume语句将其唤醒,所以千万不能将resume()用在已被挂起的线程语句中 join() 例11-7 已经生成并运行了一个线程tt,而在另一线程中执行方法timeout() ,其定义如下,在执行方法timeout()以后,现行的线程将被阻塞,直到tt运行结束 public void timeout(){ // 暂停该线程,等候其他线程结束 tt.join(); // 其他线程结束后,继续执行该线程 ………… } join()方法在调用时也可以使用一个以毫秒计的时间值 ,此时join方法将挂起现行线程timeout毫秒,或直到调用的线程结束,实际挂起时间以二者中时间较少的为准 void join(long timeout); 同步问题 线程间的通信 管道流可以连接两个线程间的通信 两个线程,一个写线程往管道流中输出信息,一个读线程从管道流中读入信息 程序11-5 线程间资源互斥共享 通常,一些同时运行的线程需要共享数据,每个线程就必须要考虑与他一起共享数据的其他线程的状态与行为,否则不能保证共享数据的一致性,从而不能保证程序的正确性。 例 11-8 一个代表栈的类 例11-8 错误情况1 假设线程a负责加入字符,线程b负责移出字符。线程a刚刚加入了一个字符,例如是r,但是尚未递增索引值,由于某种原因,恰恰这时它被抢占了: buffer | p | q | r | | | | idx=2 ^ idx=3 错误情况2 如果此时线程b正在等待移出一个字符,当线程a处于等待状态时,线程b就得到了运行机会。这样,在进入方法pop()时,数据状态已经是错误的。pop方法将继续递减索引值,idx变为1 buffer | p | q | r | | | | idx=1 ^ 操作后将返回字符“q”,而忽略字符“r” 错误情况3 如果线程a从push()方法中被打断的地方继续运行,递增了索引值,idx修正为2 ,此时的状态下“q”是有效的,而包含了“r”的位置是下一个空元素。再出栈的话,又会得到“q”。换句话说,我们将再次读到“q”,就好像它被存入栈中两次一样,但是将再也读不到字母“r”了 buffer | p | q | r | | | | inx=2 ^ 例子说明 产生这种问题的原因是对共享资源访问的不完整性 完整性称为共享数据操作的同步,共享数据叫做条件变量 解决问题的方法 禁止线程在完成代码关键部分时被切换 提供一个特殊的锁定标志来处理数据 (Java采用的方法 ) 对象的锁定标志 “对象互斥锁” (又称为监视器、管程) 实现不同线程对共享数据操作的同步。“对象互斥锁”阻止多个线程同时访问同一个条件变量。Java可以为每一个对象的实例配有一个“对象互斥锁” 实现“对象互斥锁”两种方法 用关键字volatile来声明一个共享数据(变量); 用关键字synchronized来声明一个操作共享数据的方法或一段代
您可能关注的文档
最近下载
- 水泵基础知识培训讲解.ppt
- 中学九年级上学期期末跟踪测试数学试卷(带解析)基础知识模拟复习卷.doc VIP
- 中航工业各研究所.pdf
- 智慧城市建设 专业课件.ppt
- 【化学】人教版高中化学知识点归纳总结(超详细).docx
- 英语词汇学习理论——认知加工层次理论.pdf
- 《ISO56001-2024创新管理体系 — 要求》之4:“4组织环境-确定创新管理体系的范围”解读和应用指导材料(雷泽佳编制-2024).pdf VIP
- 钢结构铝板屋面施工控制.doc VIP
- 历史课堂中的思维导图应用探讨教学研究课题报告.docx
- 中学九年级上学期期末测试数学试卷(一)(带解析)基础知识习题卷.doc VIP
文档评论(0)