13.1 动机
13.2 基本线程
垃圾回收器只有在线程离开了run()并且死亡之后才能把它清理掉。
如果必须要控制现成的执行顺序,最好是根本不用线程,而是自己编写特定顺序彼此控制的协作子程序。
继承Thread类或者实现Runnable接口。
内部类实现。
13.3 共享受限资源
1)如果要对类中的某个方法进行同步控制,最好同步所有方法。如果忽略了其中一个,通常很难确定这么做是否会有负面影响。
2)当去除方法的同步控制时,要非常小心。通常这么做是基于性能方面的考虑,但在JDK1.3、1.4中,同步控制所需的负担已经大大减少。此外,只应在使用性能评价工具证实了同步控制确实是性能瓶颈的时候,才这么做。
有时,你只是希望防止多个线程同时访问方法内部的部分代码而不是防止整个方法。通过这种方式分离出来的代码段被称为“临界区”,它也使用synchronized关键字建立。在这里,synchronized被用来指定某个对象,此对象的锁被用来对花括号内的代码进行同步控制。
宁愿使用同步控制块而不是对整个方法进行同步控制的典型原因:使得其他线程更多地访问。
13.4 线程状态
13.5线程之间的协作
13.5.1 等待与通知
调用sleep()的时候锁并没有被释放。wait()方法的确释放了锁。
13.5.2 线程间使用管道进行输入输出
13.6 死锁
13.7 正确的停止方法
不使用已经废弃了的stop(),而是使用一个标志来告诉线程何时通过退出其run()方法来终止自己。
13.8 中断阻塞线程
使用interrupt()
13.9 线程组
失败的尝试