- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
设计正确的多线程应用程序① 标识可能由多个线程同时访问的共享数据 ? 这可能是设计多线程应用程序的最重要事情。 这些数据通常定义了应用程序的临界区(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)