sleep和wait的区别:
1、 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
sleep是Thread的静态类方法,static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
void wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
2、 sleep 释放cpu执行权,不主动释放锁;wait 释放cpu执行权,主动释放锁。
3、使用范围:wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
4、sleep必须捕获异常。
sleep测试:
public class Tsleep {
public static void main(String[] args) {
new Thread() {
public void run() {
synchronized (Tsleep.class) {
System.out.println(" Sleep:当前时间:" + System.currentTimeMillis());
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
};
}.start();
new Thread() {
public void run() {
synchronized (Tsleep.class) {
System.out.println(" sleep:结束时间:" + System.currentTimeMillis());
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
};
}.start();
}
}
结果:
Sleep:当前时间:1565350398554
sleep:结束时间:1565350401555
wait测试:
public class Twait {
public static void main(String[] args) {
Twait twait = new Twait();
new Thread() {
@Override
public void run() {
synchronized (twait) {
try {
System.out.println(" 等待开始 ,当前时间:" + System.currentTimeMillis());
twait.wait();
} catch (Exception e) {
System.out.println(e);
}
}
}
}.start();
new Thread() {
@Override
public void run() {
synchronized (twait) {
try {
Thread.sleep(3 * 1000);
twait.notifyAll();
System.out.println(" 唤醒等待,结束时间:" + System.currentTimeMillis());
} catch (Exception e) {
System.out.println(e);
}
}
}
}.start();
}
}
结果:
等待开始,当前时间:1565350448702
唤醒等待,结束时间:1565350451704
通过两个测试类的结果,可以看出同样都是休眠3000ms,sleep没有立即释放锁,而wait在等待结束后立即主动释放了锁。