sleep和wait方法主要区别
- sleep是thread的方法,wait是object的方法
- sleep不会释放锁,wait释放锁
- 使用sleep不需要定义synchronize,使用wait必须要定义synchronize
- 使用sleep的时候不需要被唤醒,但是wait需要notify
通过编码验证第3、4点
public class DifferenceOfSleepAndWait {
private static final Object LOCK = new Object();
public static void main(String[] args) {
m1();
m2();
}
public static void m1() {
try {
Thread.sleep(2_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void m2() {
// 如果没有同步代码块
synchronized (LOCK) {
try {
System.out.println("当前线程" + Thread.currentThread().getName() + "enter");
LOCK.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
分别执行m1和m2方法,并且m2方法不加如synchronized
m2方法加入synchronize后
通过编码验证第2点
public class DifferenceOfSleepAndWait {
private static final Object LOCK = new Object();
public static void main(String[] args) {
Stream.of("T1", "T2")
.forEach(
name -> {
new Thread(name) {
@Override
public void run() {
// m2();
m3();
}
}.start();
});
}
public static void m1() {
try {
Thread.sleep(2_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void m2() {
synchronized (LOCK) {
try {
System.out.println("当前线程" + Thread.currentThread().getName() + "enter");
LOCK.wait();
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void m3() {
synchronized (LOCK) {
try {
System.out.println("the thread"+Thread.currentThread().getName()+"enter");
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
多线程中,分别执行m2和m3方法
执行m2方法,线程t1和t2几乎同时进入
执行m3方法,休眠10秒后t2线程才会执行