7 第11章 多线程2.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文档。上传文档
查看更多
第11章 多 线 程 主要内容 线程相关的概念 线程的生存周期 线程优先级与调度策略 线程的创建和执行 通过继承Thread的子类创建线程 通过实现Runnable 接口创建线程 多线程的同步控制 线程间的通信 多线程的守护 为什么要引入同步机制 在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源。必须对这种潜在资源冲突进行预防。例如模拟银行取款的例子:bank.java 解决方法:在线程使用一个资源时为其加锁即可。访问资源的第一个线程为其加上锁以后,其他线程便不能再使用那个资源,除非被解锁。这就是线程同步的概念。例如修改Bank.java后的 BankAdvance.java 2. 怎样实现同步 对于访问某个关键共享资源的所有方法,都必须把它们设为synchronized synchonized的一般使用格式有: synchonized (对象) { …… } 或 public synchonized 返回类型 方法名() { …… } Synchonized的功能是:首先判断对象或方法的互斥锁是否在,若在就获得互斥锁;然后就可以执行紧随其后的临界代码或方法体;如果对象或方法的互斥锁不在(已被其他线程拿走),就进入等待状态,直到获得互斥锁。 一个对象上可定义多个同步语句或同步方法。 Java系统只允许一个线程,执行对象的一个同步语句或一个同步方法。 一个线程在进入同步语句或同步方法时要给对象加互斥锁(获得锁),一个对象只能加一把互斥锁,加锁成功时才能执行同步语句; 而其它所有试图对同一个对象执行同步语句的线程,因加锁不成功都将处于阻塞状态。 在同步语句或同步方法完成执行时,同步对象上的锁被解除,并让最高优先级的阻塞线程处理它的同步语句。 一个对象中的所有synchronized方法都共享一把锁,这把锁能够防止多个方法对共用内存同时进行的写操作。 在线程获得对象的锁情形下,如果该线程确定只有在一些条件下满足的情况下,才能继续对该对象执行线程任务,这时该线程可调用Object类的wait()方法。 线程调用wait方法会解除对象的锁,并使该线程处于等待状态,让出CPU资源,使其它线程将尝试执行该对象的同步语句。 在某个线程执行完同步语句,或该线程使另一个线程所等待的条件满足时,它将调用Object类的notify()方法,以允许一个处于等待状态的线程再次进入就绪状态。这时,从等待状态进入就绪状态的线程,将再次尝试获得该对象的锁。 Object类的notifyAll()方法将使因该对象处于等待状态的全部线程进入就绪状态。 注意:wait方法和notify方法一般配合使用。 wait()和sleep()的区别:wait()方法被调用时会解除锁定,但使用它的地方只是在一个同步的方法或代码块内。 11.6 多线程同步的程序设计举例 程序假设共享缓冲区只用一个整型数据。int buffer 生产者线程生产的数据在放入共享缓冲区时,要检查缓冲区是否空, 若空,则将数据写入缓冲区,并调用notify方法使处于等待状态的消费者线程转为就绪状态; 若不空,则调用wait方法使自己等待。 消费者线程在从共享缓冲区读数据时,应检查缓冲区是否已有数据存 在, 若有数据存在,则从缓冲区读数据,并调用notify方法使处于等待状态的生产者线程转为就绪状态; 若无数据存在,则调用wait方法使自己等待。 程序使用条件变量occupiedBufferCount控制缓冲区buffers读写,当occupiedBufferCount为0时,可写但不能读,当occupiedBufferCount为1时,可读但不能写。 程序由四个源文件组成: Buffer.java定义了共享缓冲区的读写管理类; Producer.java定义了生产者类; Consumer.java定义了Consumer类; SharedBufferTest.java定义了测试类.在main方法中,创建了一个生产者线程和一个消费者线程,并分别启动了它们。 程序运行的输出结果: 小 结 线程在一个完整地操作所有动作的执行过程中,都占有相关资源而不被打断,这就是线程的同步。 当一个线程对共享的数据进行操作时,在没有完成相关操作之前,不允许其他线程打断它,使之成为一个“原子操作”;否则就会破坏数据的完整性,必然会得到错误的处理结果。 被多个线程共享的数据在同一时刻只允许一个线程处于操作之中,这就是同步控制中的线程间的互斥。 synchronized 锁定的是一个具体对象,通常是临界区对象。由于所有锁定同一个对象的线程之间,在synchronized 代码块上是互斥的,也就是说,这些线程的

文档评论(0)

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

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

1亿VIP精品文档

相关文档