Java应用开发与实践 刘乃琦 苏畅 第16章 多线程新.pptVIP

Java应用开发与实践 刘乃琦 苏畅 第16章 多线程新.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
16.5 线程的优先级 每个线程都具有各自的优先级,线程的优先级可以在程序中表明该线程的重要性,如果有很多线程处于就绪状态,系统会根据优先级来决定首先使哪个线程进入运行状态。但这并不意味着低优先级的线程得不到运行,而只是它运行的几率比较小,比如垃圾回收线程的优先级就较低。 Thread类中包含的成员变量代表了线程的某些优先级,比如Thread.MIN_PRIORITY(常数1)、Thread.MAX_PRIORITY(常数2)、Thread.NORM_PRIORITY(常数5)。其中每个线程的优先级都在Thread.MIN_PRIORITY~Thread.MAX_PRIORITY之间,在默认情况下其优先级都是Thread.NORM_ PRIORITY。每个新产生的线程都继承了父线程的优先级。 在多任务操作系统中,每个线程都会得到一小段CPU时间片运行,在时间结束时,将轮换另一个线程进入运行状态,这时系统会选择与当前线程优先级相同的线程予以运行。系统始终选择就绪状态下优先级较高的线程进入运行状态。图16-9表明了处于各个优先级状态下的线程的运行顺序。 在图16-9中,优先级为5的线程A首先得到CPU时间片;当该时间结束后,轮换到与线程A相同优先级的线程B;当线程B的运行时间结束后,会继续轮换到线程A,直到线程A与线程B都执行完毕,才会轮换到线程C;当线程C结束后,最后才会轮到线程D。 线程的优先级可以使用setPriority()方法调整,如果使用该方法设置的优先级不在1~10之内,将产生一个IllegalArgumentException异常。 16.6 线程同步 16.6.1 线程安全 16.6.2 线程同步机制 16.6.1 线程安全 实际开发中,使用多线程程序的情况很多,如银行排号系统、火车站售票系统等。这种多线程的程序通常会发生问题,以火车站售票系统为例,在代码中判断当前票数是否大于0,如果大于0则执行将该票出售给乘客功能,但当两个线程同时访问这段代码时(假如这时只剩下一张票),第一个线程将票售出,与此同时第二个线程也已经执行完成判断是否有票的操作,并得出结论票数大于0,于是它也执行售出操作,这样就会产生负数。所以在编写多线程程序时,应该考虑到线程安全问题。实质上线程安全问题来源于两个线程同时存取单一对象的数据。 16.6.2 线程同步机制 如何解决资源共享的问题?基本上所有解决多线程资源冲突问题都会采用给定时间只允许一个线程访问共享资源,这时就需要给共享资源上一道锁。这就好比一个人上洗手间,这个人进入洗手间后将门锁上,当他出来时再将锁打开,然后其他人才可以进入。 1.同步块 在Java中提供了同步机制,可以有效地防止资源冲突。同步机制使用synchronized关键字。 2.同步方法 同步方法就是在方法前面修饰synchronized关键字的方法,其语法如下。 synchronized void f(){} 当某个对象调用了同步方法,该对象上的其他同步方法必须等待该同步方法执行完毕才能被执行。必须将每个能访问共享资源的方法修饰为synchronized,否则就会出错。 16.7 线程间的通信 在学习完如何避免线程产生冲突的问题后,下面将学习线程之间的通信。线程之间的通信使用wait()、notify()以及notifyAll()方法实现。 我们知道线程如果调用wait()方法后可以使该线程从运行状态进入就绪状态,而sleep()方法也达到这样一个效果,那么两者究竟有何区别?从同步的角度上来说,调用sleep()方法的线程不释放锁,但调用wait()方法的线程释放锁。 使用wait()方法有以下两种形式: wait(time) wait() 第一种形式的wait()方法与sleep()方法的含义相同,都是指在此时间之内暂停;而第二种形式的wait()方法会使线程永久无限地等待下去,需要使用notify()或者notifyAll()方法唤醒。 (1)Java语言自诞生之日起就支持多线程。 (2)实现线程的两种常见方式是继承Thread类和实现Runnable接口。 (3)线程共有以下6种状态:新建、运行(可运行)、阻塞、等待、计时等待和终止。 (4)Thread类中定义的sleep()方法可以让线程休眠。 (5)Thread类中定义的join()方法可以让线程插队运行。 (6)使用布尔值判断条件的方式可以实现线程的停止。 (7)可以为线程设置优先级,具有高优先级的线程其运行的概率比低优先级的线程大。 (8)使用线程同步可以避免线程死锁、数据读写错误等问题。 (9)可以使用

您可能关注的文档

文档评论(0)

开心农场 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档