关于java中wait()和sleep()方法间的区别

时间:2021-08-05 23:21:39
//摘取自一位前辈的测试代码
public class TestD {

public static void main(String[] args) {
//同时开始两个线程,先进行第一个线程Thread1,再进行第二个线程Thread2
new Thread(new Thread1()).start();
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(new Thread2()).start();
}


private static class Thread1 implements Runnable{
public void run(){
synchronized (TestD.class) {
System.out.println("enter thread1...");
System.out.println("thread1 is waiting...");
try {
//调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
TestD.class.wait();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread1 is going on ....");
System.out.println("thread1 is over!!!");
}
}
}

private static class Thread2 implements Runnable{
@Override
public void run(){
synchronized (TestD.class) {
System.out.println("enter thread2....");
System.out.println("thread2 is sleep....");
//只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
TestD.class.notify();
//==================
//区别
//如果我们把代码:TestD.class.notify();给注释掉,即TestD.class调用了wait()方法,但是没有调用notify()
//方法,则线程永远处于挂起状态。
try {
//sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,
//但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
//在调用sleep()方法的过程中,线程不会释放对象锁。
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread2 is going on....");
System.out.println("thread2 is over!!!");
}
}
}
}

因为这里的代码是直接引用一位前辈的代码,讲解是自己加的,尊重原创,这里就发成转载的吧

初步看java中的wait()和sleep()方法,感觉这两个方法的区别并不大。
1.sleep是让线程让出CPU来让其他线程使用,然而并不释放对象锁,与之相对的,wait同样进行让线程让出CPU的操作,然而,wait会要求线程释放对象锁,同时在调用notify方法之前,放弃重新获得对象锁的可能性。