** //sleep与wait的区别
// sleep对象不会释放锁对象
// wait会释放锁对象
**“`
//创建一个类
public class PrinterDeadLock {
private String s1 = “我是s1”;
private String s2 = “我是s2”;
public void p1() {
synchronized (s1) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
//s1是锁对象,调用了s1锁对象的wait方法
//wait方法,会释放锁对象
//并且,使得线程进入阻塞状态
s1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("s1锁住了p1");
synchronized (s2) {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("s2锁住了p1");
}
}
}
}
public void p2() {
synchronized (s2) {
System.out.println("s2锁住了p2");
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (s1) {
System.out.println("s1锁住了p2");
//调用s1锁对象的
//notifyAll方法
//会唤醒被s1调用wait方法
// 进入阻塞状态的线程
s1.notifyAll();
}
}
}
}
}
//Main函数中调用
private static void showDeadLock() {
PrinterDeadLock pdl = new PrinterDeadLock();
new Thread(new Runnable() {
@Override
public void run() {
pdl.p1();
}
}).start();
//JNI --java native interface
new Thread(new Runnable() {
@Override
public void run() {
pdl.p2();
}
}).start();
}
“`
运行结果:

本文通过一个具体的Java死锁案例,详细解释了线程中的sleep与wait方法的区别。sleep方法不会释放对象锁,而wait方法则会释放。此外,还介绍了如何使用notifyAll方法来唤醒因调用wait而阻塞的线程。
1061

被折叠的 条评论
为什么被折叠?



