上一篇文章 《synchronized 与wait、notify的关系,多线程安全 与 线程通信 的关系》 中 仔细分析了 wait、notify 与synchronzied 的关系。
wait()、notify() :当线程调用wait()方法后会进入阻塞状态,进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。 需要注意的是执行notify后,并未立即释放锁,而是在执行完 notify所在 synchronized 的代码块后 才释放锁的, 因此被此锁阻塞的的线程需要在 notify所在 synchronized 的代码块后 才能进行可执行状态。
suspend() 、resume():两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume()被调用,才能使得线程重新进入可执行状态。典型地,suspend()和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume()使其恢复。
sleep()、wait(): sleep()方法属于Thread类的静态方法,wait()方法属于 Object类的成员方法。
a、sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。
b、调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
区别的核心在于:
1、suspend()在引起当前所在线程阻塞后,不会释放线程占用的锁(如果占用了的话)
2、wait() 引起当前所在线程阻塞后,会释放占用的锁,并且必须 wait对象的锁必须被当前线程持有
3、wait与notify 需要 synchronized 锁来包裹.