(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正常协作。