- 1、本文档共60页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
结束线程例 例 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来声明一个操作共享数据的方法或一段代码。 例 11-9 class stack{ int idx = 0; char data[] = new char[6]; ? public void push(char c){ synchronized (thi
您可能关注的文档
- 人教版八年级上册26课《三峡》课件讲义.ppt
- 大学生人格分解.ppt
- 人教版八年级上册第六单元第30课诗四首课件(44张)讲义.ppt
- 人教版八年级数学上册同步测试:14-2-1乘法公式(无答案)讲义.doc
- 大学生人际交往心理分解.ppt
- 人教版八年级数学上多边形及其内角和---多边形讲义.ppt
- 中药分析学复习资料讲义.docx
- 第二章汽车基本结构与性能原理分解.ppt
- 中国公关第一人讲义.pptx
- 中国公路教你认识大中华的高速公路与国道讲义.doc
- 2024学年第一学期浙江省精诚联盟10月联考高二物理试题含答案及解析.pdf
- 【山东卷】山东省泰安市2024-2025学年高三上学期11月期中考试(11.13-11.15)英语试卷含答案及解析.pdf
- 【浙江卷】浙江省杭州市四校联考2024-2025学年高一上学期10月月考英语试卷含答案及解析.pdf
- 西南大学附中高一10月月考生物试卷含答案及解析.pdf
- 辽宁省县域重点高中协作体2024~2025学年高一上学期10月质量监测试题历史试卷含答案及解析.pdf
- 基于多功能超疏水材料的海水淡化及油水分离研究.pdf
- FKBP5基因多态性与抚养方式对孤儿静息态脑功能的影响.pdf
- 《因明入正理论略抄及后疏》的研习与创作感受.pdf
- HIF-1α、SGK1在子宫内膜增生及子宫内膜癌孕激素抵抗中的表达和意义.pdf
- 初中信息科技大单元教学设计框架构建及应用研究--以《人工智能》大单元为例.pdf
文档评论(0)