网站大量收购独家精品文档,联系QQ:2885784924

Java语言PPT教学课件-第八章 线程.ppt

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java语言PPT教学课件-第八章 线程

第八章 线程 ?本章导读 1. Java中的线程 2. 线程的生命周期 3. 线程的优先级与调度管理 4. Thread的子类创建线程 5.使用Runable接口 6.线程的常用方法 7.线程同步 8.在同步方法中使用wait()、notify 和notifyAll 9.线程的联合 10.守护线程 Java线程 每个Java程序都有一个默认的主线程。 Java应用程序总是从主类的main方法开始执行。当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称做“主线程”,该线程负责执行main方法。那么,在main方法的执行中再创建的线程,就称为程序中的其他线程。 如果main方法中没有创建其他的线程,那么当main方法执行完最后一个语句,即main方法返回时,JVM就会结束Java应用程序。 如果main方法中又创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,保证每个线程都有机会使用CPU资源。 main方法即使执行完最后的语句(主线程结束),JVM也不会结束程序,JVM一直要等到程序中的所有线程都结束之后,才结束Java应用程序。 Java线程 多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,由此带来线程调度、同步等问题需要解决。 8.7 线程同步 Java使我们可以创建多个线程,在处理多线程问题时,我们必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一个线程需要修改这个变量。我们应对这样的问题作出处理,否则可能发生混乱。比如,当一个线程正在修改文件的内容时,如果另一个线程也要修改同样的文件,就会出现混乱的局面。 在处理线程同步时,要做的第一件事就是要把修改数据的方法用关键字:synchronized来修饰。一个方法使用关键字synchronized修饰后,如果一个线程A占有CPU资源期间,使得该方法被调用执行,那么在该同步方法返回之前,即同步方法调用执行完毕之前,其他占有CPU资源的线程一旦调用这个同步方法就会引起堵塞,堵塞的线程要一直等到堵塞的原因消除(同步方法返回),再排队等待CPU资源,以便使用这个同步方法。 8.8 在同步方法中使用wait()、notify和notifyall wait()、notify()和notifyAll()都是Object类中的final方法,被所有的类继承,且不允许重写的方法。 当一个线程使用的同步方法中用到某个变量,而此变量又需要其它线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法。使用wait()方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。其它线程如果在使用这个同步方法时不需要等待,那么它使用完这个同步方法的同时,应当用notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。 在下面的例子中,为了避免复杂数学算法,我们模拟3个人排队买票,每人买1张票。售票员只有1张五元的钱,电影票五元钱一张。张某拿1张二十元的人民币排在孙某前面买票,孙某拿1张十元的人民币排在赵的前面买票,赵某拿1张五元的人民币排在最后。 8.9 线程联合 一个线程A在占有CPU资源期间,可以让其它线程调用join()和本线程联合, 如: B.join(); 我们称A在运行期间联合了B。如果线程A在占有CPU资源期间一旦联合B线程,那么A线程将立刻中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源,以便恢复执行。如果A准备联合的B线程已经结束,那么B.join()不会产生任何效果。 在下面的例子11中,一个线程在运行期间联合了另外一个线程。 8.10 守护线程 一个线程调用 void setDaemon(boolean on) 方法可以将自己设置成一个守护(Daemon)线程,例如: thread.setDaemon(true); 线程默认是非守护线程,非守护线程也称作用户(user)线程。 当程序中的所有用户线程都已结束运行时,即使守护线程的run方法中还有需要执行的语句,守护线程也立刻结束运行。一般地,用守护线程做一些不是很严格的工作,线程的随时结束不会产生什么不良的后果。一个线程必须在运行之前设置自己是否是守护线程。 下面的例子12中有一个守护线程 public class Xyz implements Runnable { private boolea

文档评论(0)

skvdnd51 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档