- sleep是Thread的方法,wait是Object的方法
- sleep不会释放锁,wait会释放锁
- sleep不需要依赖锁,而wait需要
- sleep不需要唤醒,但是wait需要
用例子来解释3
private static Object lock = new Object();
public static void m1(){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void m2(){
synchronized (lock){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
m2方法必须要用synchronized锁住一个对象,否则会抛IllegalMonitorStateException.
用例子解释2
private final static Object lock = new Object();
public static void main(String[] args) {
Stream.of("t1", "t2").forEach(name -> new Thread(name) {
@Override
public void run() {
m1();
}
}.start());
}
public static void m1() {
synchronized (lock) {
try {
System.out.println("m1====" + Thread.currentThread().getName());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void m2() {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
结果是打印完m1后,过10s才会继续打印m2
private final static Object lock = new Object();
public static void main(String[] args) {
Stream.of("t1", "t2").forEach(name -> new Thread(name) {
@Override
public void run() {
m2();
}
}.start());
}
public static void m1() {
synchronized (lock) {
try {
System.out.println("m1====" + Thread.currentThread().getName());
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void m2() {
synchronized (lock) {
try {
System.out.println("m1====" + Thread.currentThread().getName());
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
如果改成m2,则两句话会几乎同时打印