不提倡使用的方法是为支持向后兼容性而保留的那些方法它们在以后的版本中可能出现也可能不出现Java 多线程支持在版本 和版本 中做了重大修订stop()suspend() 和 resume() 函数已不提倡使用这些函数在 JVM 中可能引入微妙的错误虽然函数名可能听起来很诱人但请抵制诱惑不要使用它们
调试线程化的程序
在线程化的程序中可能发生的某些常见而讨厌的情况是死锁活锁内存损坏和资源耗尽
死锁
死锁可能是多线程程序最常见的问题当一个线程需要一个资源而另一个线程持有该资源的锁时就会发生死锁这种情况通常很难检测但是解决方案却相当好在所有的线程中按相同的次序获取所有资源锁例如如果有四个资源 —ABC 和 D — 并且一个线程可能要获取四个资源中任何一个资源的锁则请确保在获取对 B 的锁之前首先获取对 A 的锁依此类推如果线程 希望获取对 B 和 C 的锁而线程 获取了 AC 和 D 的锁则这一技术可能导致阻塞但它永远不会在这四个锁上造成死锁
活锁
当一个线程忙于接受新任务以致它永远没有机会完成任何任务时就会发生活锁这个线程最终将超出缓沖区并导致程序崩溃试想一个秘书需要录入一封信但她一直在忙于接电话所以这封信永远不会被录入
内存损坏
如果明智地使用 synchronized 关键字则完全可以避免内存错误这种气死人的问题
资源耗尽
某些系统资源是有限的如文件描述符多线程程序可能耗尽资源因为每个线程都可能希望有一个这样的资源如果线程数相当大或者某个资源的侯选线程数远远超过了可用的资源数则最好使用 资源池一个最好的示例是数据库连接池只要线程需要使用一个数据库连接它就从池中取出一个使用以后再将它返回池中资源池也称为 资源库
调试大量的线程
有时一个程序因为有大量的线程在运行而极难调试在这种情况下下面的这个类可能会派上用场
public class Probe extends Thread {
public Probe() {}
public void run() {
while(true) {
Thread[] x = new Thread[];
Threadenumerate(x);
for(int i=; i<; i++) {
Thread t = x[i];
if(t == null)
break;
else
Systemoutprintln(tgetName() + \t + tgetPriority()
+ \t + tisAlive() + \t + tisDaemon());
}
}
}
}