Java–sleep()和wait()区别

对照代码来解释比较好理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.Thread;

public class ThreadTest {
private static Object lockedObject = new Object();
public static class WaitRunner implements Runnable{

@Override
public void run() {
synchronized (lockedObject){
// long startTime=System.currentTimeMillis(); //获取开始时间
System.out.println("locked object monitor enter");//第一个打印
try {
lockedObject.wait(2000);//释放了锁,所以等待一段1000ms后进入第二个线程,但是2000ms后不能进入这个,因为sleep不释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
// long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("locked object get monitor again");
// System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
}
}
}
public static class NotifyRunner implements Runnable{

@Override
public void run() {
synchronized (lockedObject) {
System.out.println("notify locked object monitor enter");
lockedObject.notifyAll();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("notify end");
}
}
}

public static void main(String[] args) {
//开启wait线程
new Thread(new WaitRunner(),"wait").start();
//等待
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//开启notify线程
new Thread(new NotifyRunner(),"notify").start();
}
}

运行结果

1
2
3
4
locked object monitor enter
notify locked object monitor enter
notify end
locked object get monitor again

两者区别和共同点如下

  1. 两者最主要的区别是:sleep()不释放锁,wait()释放锁
  2. 两者都可以暂停线程的执行
  3. wait主要是用于线程之间的交互、通信,sleep通常就是用来暂停执行的
  4. wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者notifyAll()方法。sleep()方法执行完成后,线程会自动苏醒。或者使用wait(long timeout)超时后线程自动苏醒