面向对象java程序设计之多线程精讲教案分析.ppt

面向对象java程序设计之多线程精讲教案分析.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
设计正确的多线程应用程序 ① 标识可能由多个线程同时访问的共享数据 ? 这可能是设计多线程应用程序的最重要事情。 这些数据通常定义了应用程序的临界区(critical region)。 ② 保证共享数据不被多个线程同时访问 ? 须保证访问共享数据的各线程之间互斥(mutual exclusion)。 如果未正确处理互斥,可能导致不见预见的结果。 ? 互斥通常利用数据上的锁来实现。 锁用于避免同时的并发访问。 // 一个线程安全的程序 public class ThreadSafeTeller { private int balance = 0; private boolean smile = false; synchronized void credit(int cash) { balance += cash; smile = (balance 10000); } synchronized void debit(int cash) { balance -= cash; smile = (balance 10000); } } sleep()方法 join()方法 wait()/notify()方法 11.5 线程阻塞 sleep()方法 指定在某一段时间(以毫秒为单位)内线程处于阻塞状态。 状态转换: Running ? Blocked:调用一个线程的sleep()方法。 Blocked ? Running:时间事件。 经过指定时间段后,线程又自动恢复为可执行状态。 JDK只保证在指定时间之后被唤醒,不保证准确的时间! 注意事项: 如果在同步代码段中执行本方法,线程占有的锁不会释放。 这种行为不同于下述的wait()方法。 应用实例: 定期检测线程T所需的某一资源R是否就绪。 如果线程T检测到资源R尚未就绪, 则线程T阻塞一段时间后继续循环检测。 sleep()方法 // 演示调用sleep()方法阻塞线程的用法 public class SleepThread implements Runnable { public void run() { while (true) { // 执行线程本身要完成的任务 ... // 给其他线程一个执行的机会 try { Thread.sleep(100); } catch (InterruptedException exc) { // 本线程的睡眠被另一线程中断,例如: // 另一线程持有本线程的对象引用并调用interrupt()方法 ... } } } } join()方法 让线程进入阻塞状态,等待另一正在运行线程结束后恢复执行。 状态转换: Running ? Blocked:调用另一个线程的join()方法。 Blocked ? Running:取决于join()方法的参数。 带时间参数版表示有两个事件均会导致线程重返可执行状态: ① 另一线程执行完毕。 ② 经过的时间已超过指定的时间长度(毫秒)。 无时间参数版表示仅当事件①出现时线程才重返可执行状态。 应用实例: 通常结合isAlive()方法使用。 该方法返回线程是否已启动且未结束。 设线程t调用线程s的join()方法后阻塞, 则当s.alive()为false时线程t重返可执行状态。 必须放在一个try-catch块中处理。 因为join()造成的阻塞可由interrupt()方法中断。 join()方法 class Sleeper extends Thread { public Sleeper(String name) { super(name); start(); } public void run() { try { sleep(5000); } catch (InterruptedException e) { System.out.println(getName() + 睡眠被中断。); return; } System.out.println(getName() + 睡醒了!); } } public class Waiter extends Thread { private Sleeper sleeper; public Waiter(String name, Sleeper sleeper) { super(name); this.sleeper = sleeper; start();

文档评论(0)

奇缘之旅 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档