Java大学实用教程第八章程序.pptVIP

  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文档。上传文档
查看更多
例子8-5效果图 * 2.目标对象与线程的关 目标对象和线程的关系有以下两种情景。 1)目标对象和线程完全解藕 在上述例8-5中,创建目标对象的Bank类并没有组合zhang和cheng线程对象,也就是说Bank创建的目标对象bank不包含对象zhang和cheng线程对象的引用(完全解藕)。在这种情况下,目标对象经常需要通过获得线程的名字(因为无法获得线程对象的引用): String name = Thread.currentThread().getName(); 以便确定是哪个线程正在占用CPU资源,即被JVM正在执行的线程。 2)目标对象组合线程(弱藕合) 目标对象可以组合线程,即将线程作为自己的成员(弱藕合),比如让线程zhang和cheng在bank中。当创建目标对象类组合线程对象时,目标对象可以通过获得线程对象的引用: Thread.currentThread(); 来确定是哪个线程正在占用CPU资源,即被JVM正在执行的线程,如下面的例8-7中代码所示。 * 3 关于run()方法中的局部变量 对于具有相同目标对象的线程,当其中一个线程享用CPU资源时,目标对象自动调用接口中的run()方法,这时run()方法中的局部变量被分配内存空间。当轮到另一个线程享用CPU资源时,目标对象会再次调用接口中的run()方法,那么run()方法中的局部变量会再次分配内存空间。也就是说,run()方法已经启动运行了两次,分别运行在不同的线程中,即运行在不同的时间片内。 我们称run()方法中的局部变量为线程的局部变量,不同线程的run()方法中的局部变量互不干扰,一个线程改变了自己的run()方法中局部变量的值不会影响其他线程的run()方法中的局部变量。 例8-8演示了两个线程的run()方法中的局部变量互不干扰(效果如图8.3所示)。 * 8.6 线程的常用方法_1 1.start() 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的主线程独立开始自己的生命周期了。 2.run() Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。 Thread类中,run()方法没有具体内容,所以用户程序需要创建自己的Thread类的子类,并重写run()方法来覆盖原来的run()方法。当run()方法执行完毕,线程就变成死亡状态。在线程没有结束run()方法之前,不建议让线程再调用start()方法,否则将发生IllegalThreadStateException异常。 3.sleep(int millsecond) 有时,优先级高的线程需要优先级低的线程做一些工作来配合它,或者优先级高的线程需要完成一些费时的操作,此时优先级高的线程应该让出处理器,使优先级低的线程有机会执行。为达到这个目的,优先级高的线程可以在它的run()方法中调用sleep()方法来使自己放弃处理器资源,休眠一段时间。休眠时间的长短由sleep()方法的参数决定,millsecond是毫秒为单位的休眠时间。如果线程在休眠时被打断,JVM就抛出InterruptedException异常。因此,必须在try-catch语句块中调用sleep()方法。 * 8.6 线程的常用方法_2 4.isAlive() 在线程的run方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true,当线程进入死亡状态后(实体内存被释放),线程仍可以调用方法isAlive(),这时返回的值是false。 需要注意的是,一个已经运行的线程在没有进入死亡状态时,不要再给线程分配实体,由于线程只能引用最后分配的实体,先前的实体就会成为“垃圾”,并且不会被垃圾收集机收集掉。内存示意如图8.4、图8.5所示。 例8-9中,一个线程每隔1秒钟在命令行窗口输出机器的当前时间,在输出3秒之后,该线程又被分配了实体,新实体又开始运行。这时,我们在命令行每秒钟能看见两行当前时间,因为垃圾实体仍然在工作(效果如图8.6所示)。 5.currentThread() currentThread()方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。 6.interrupt() 当一些线程调用sleep()方法处于休眠状态时,一个使用CPU资源的其他线程在执行过程中,可以让休眠的线程分别调用in

文档评论(0)

1112111 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档