反对使用 stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象 处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出 真正的问题所在。 suspend() 方法容易发生死锁。调用 suspend() 的时候,目标线程会停下来,但却仍 然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被 "挂 起" 的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任 何一个锁定的资源,就会造成死锁。所以不应该使用 suspend(),而应在自己的 Thread 类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait() 命其进入等待状态。若标志指出线程应当恢复,则用一个 notify() 重新启动线程。
sleep 就是正在执行的线程主动让出 cpu,cpu 去执行其他线程,在 sleep 指定的时 间过后,cpu 才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep 方法并不会释放锁,即使当前线程使用 sleep 方法让出了 cpu,但其他被同步锁挡住 了的线程也无法得到执行。wait 是指在一个已经进入了同步锁的线程内,让自己暂时 让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用 了 notify 方法(notify 并不释放锁,只是告诉调用过 wait 方法的线程可以去参与获 得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果 notify 方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在 notfiy 方法后 增加一个等待和一些代码,看看效果),调用 wait 方法的线程就会解除 wait 状态和 程序可以再次得到锁后继续向下运行。