相同点
使当前线程进入阻塞状态
不同点
a. sleep是Thread类的方法,wait是Object类的方法
b. sleep可以在任意地方使用,wait因为会对对象的“锁标志”进行操作,所以只能在synchronized方法或者synchronized块中使用
c. sleep不会释放对象锁,而wait在暂停的同时会释放对象锁
d. sleep在休眠一段时间后自动苏醒,wait有两种方式,无参数的和有一个时间参数的,其中无参数的需要调用notify或者notifyAll主动唤醒。有参数的在超时后也会自动苏醒
sleep代码示例
public class SleepDemo {
public void methodA() {
synchronized (this) {
System.out.println("A begin time=" + System.currentTimeMillis());
try {
Thread.sleep(2000); //不会释放对象锁
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("A end time=" + System.currentTimeMillis());
}
}
public void methodB() {
synchronized (this) {
System.out.println("B begin time=" + System.currentTimeMillis());
System.out.println("B end time=" + System.currentTimeMillis());
}
}
class ThreadA extends Thread {
private SleepDemo sleepDemo;
public ThreadA(SleepDemo sleepDemo) {
this.sleepDemo = sleepDemo;
}
public void run() {
sleepDemo.methodA();
}
}
class ThreadB extends Thread {
private SleepDemo sleepDemo;
public ThreadB(SleepDemo sleepDemo) {
this.sleepDemo = sleepDemo;
}
public void run() {
sleepDemo.methodB();
}
}
public static void main(String[] args) {
SleepDemo sleepDemo = new SleepDemo();
ThreadA a = sleepDemo.new ThreadA(sleepDemo);
ThreadB b = sleepDemo.new ThreadB(sleepDemo);
a.start();
b.start();
}
运行结果
A begin time=1507623420839
A end time=1507623422840
B begin time=1507623422840
B end time=1507623422840
wait代码示例
public class WaitDemo {
public void methodA() {
synchronized (this) {
System.out.println("A begin time=" + System.currentTimeMillis());
try {
wait(2000); //会释放对象锁
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A end time=" + System.currentTimeMillis());
}
}
public void methodB() {
synchronized (this) {
System.out.println("B begin time=" + System.currentTimeMillis());
System.out.println("B end time=" + System.currentTimeMillis());
}
}
class ThreadA extends Thread {
private WaitDemo sleepDemo;
public ThreadA(WaitDemo sleepDemo) {
this.sleepDemo = sleepDemo;
}
public void run() {
sleepDemo.methodA();
}
}
class ThreadB extends Thread {
private WaitDemo sleepDemo;
public ThreadB(WaitDemo sleepDemo) {
this.sleepDemo = sleepDemo;
}
public void run() {
sleepDemo.methodB();
}
}
public static void main(String[] args) {
WaitDemo sleepDemo = new WaitDemo();
ThreadA a = sleepDemo.new ThreadA(sleepDemo);
ThreadB b = sleepDemo.new ThreadB(sleepDemo);
a.start();
b.start();
}
}
运行结果
A begin time=1507623587359
B begin time=1507623587360
B end time=1507623587360
A end time=1507623589363
网友评论