- 写在前面的话
- 引言
- 第 1 章 对象入门
- 第 2 章 一切都是对象
- 第 3 章 控制程序流程
- 第 4 章 初始化和清除
- 第 5 章 隐藏实施过程
- 第 6 章 类再生
- 第 7 章 多形性
- 第 8 章 对象的容纳
- 第 9 章 违例差错控制
- 第 10 章 Java IO 系统
- 第 11 章 运行期类型鉴定
- 第 12 章 传递和返回对象
- 第 十三 章 创建窗口和程序片
- 第 14 章 多线程
- 第 15 章 网络编程
- 第 16 章 设计范式
- 第 17 章 项目
- 附录 A 使用非 JAVA 代码
- 附录 B 对比 C++和 Java
- 附录 C Java 编程规则
- 附录 D 性能
- 附录 E 关于垃圾收集的一些话
- 附录 F 推荐读物
14.7 练习
(1) 从 Thread 继承一个类,并(过载)覆盖 run() 方法。在 run() 内,打印出一条消息,然后调用 sleep()。重复三遍这些操作,然后从 run() 返回。在构建器中放置一条启动消息,并覆盖 finalize(),打印一条关闭消息。创建一个独立的线程类,使它在 run() 内调用 System.gc() 和 System.runFinalization(),并打印一条消息,表明调用成功。创建这两种类型的几个线程,然后运行它们,看看会发生什么。
(2) 修改 Counter2.java,使线程成为一个内部类,而且不需要明确保存指向 Counter2 的一个。
(3) 修改 Sharing2.java,在 TwoCounter 的 run() 方法内部添加一个 synchronized(同步)块,而不是同步整个 run() 方法。
(4) 创建两个 Thread 子类,第一个的 run() 方法用于最开始的启动,并捕获第二个 Thread 对象的句柄,然后调用 wait()。第二个类的 run() 应在过几秒后为第一个线程调用 modifyAll(),使第一个线程能打印出一条消息。
(5) 在 Ticker2 内的 Counter5.java 中,删除 yield(),并解释一下结果。用一个 sleep() 换掉 yield(),再解释一下结果。
(6) 在 ThreadGroup1.java 中,将对 sys.suspend() 的调用换成对线程组的一个 wait() 调用,令其等候 2 秒钟。为了保证获得正确的结果,必须在一个同步块内取得 sys 的对象锁。
(7) 修改 Daemons.java,使 main() 有一个 sleep(),而不是一个 readLine()。实验不同的睡眠时间,看看会有什么发生。
(8) 到第 7 章(中间部分)找到那个 GreenhouseControls.java 例子,它应该由三个文件构成。在 Event.java 中,Event 类建立在对时间的监视基础上。修改这个 Event,使其成为一个线程。然后修改其余的设计,使它们能与新的、以线程为基础的 Event 正常协作。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论