场景
分析
* @deprecated This method has been deprecated, as it is
* inherently deadlock-prone. If the target thread holds a lock on the
* monitor protecting a critical system resource when it is suspended, no
* thread can access this resource until the target thread is resumed. If
* the thread that would resume the target thread attempts to lock this
* monitor prior to calling <code>resume</code>, deadlock results. Such
* deadlocks typically manifest themselves as "frozen" processes.
* For more information, see
* <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why
* are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
- suspend使线程进入挂起状态,直到resume释放这个线程。但是在这期间,suspend占用的监控器不会释放,如果释放目标线程的线程尝试获取监控器,则死锁。
死锁例子
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(ResumeAndSuspendDemo::sayHelloWorld);
thread.start();
synchronized (ResumeAndSuspendDemo.class) {
thread.resume();
}
System.out.printf("%s is over \n", Thread.currentThread().getName());
}
private static void sayHelloWorld()
{
Object monitor = ResumeAndSuspendDemo.class;
synchronized (monitor) {
try {
Thread.currentThread().suspend();
monitor.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("线程[%s] 恢复执行: <==============> Hello World!\n", Thread.currentThread().getName());
}
}