sleep()和wait()的区别

sleep()方法是属于Thread类的,wait()方法属于Object类。sleep()方法导致线程睡眠一段时间,让出cpu给其他线程,但是该线程依然处于被监控状态,并没有释放对象的锁,所以线程睡眠期间,其他线程不能获得该对象的锁,不能对该对象的其他同步方法进行调用。

wait()方法被调用会导致线程阻塞,该线程会释放对象的锁,并进入等待此对象的等待锁定池,处于挂起状态。除非此对象调用了notify()或者notifyALL()方法,本线程才会进入对象锁定池准备。

package cn.yqg.day2;

public class Thread1 implements Runnable{

    @Override
    public void run() {
        
       synchronized(Test.class) {
       System.out.println("进入线程1");
       try {
        Thread.sleep(100);
    } catch (InterruptedException e) {    
        e.printStackTrace();
    }
       System.out.println("线程1结束");
       }
    }
}
package cn.yqg.day2;

public class Thread2 implements Runnable{
    public void run() {
        synchronized(Test.class) {
            System.out.println("进入线程2");
            try {
                Test.class.wait();
            } catch (InterruptedException e) {
                
                e.printStackTrace();
            }
            System.out.println("结束线程2");
        }
    }
}
package cn.yqg.day2;

public class Test {
  public static void main(String[] args) {
    new Thread(new Thread2()).start();
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        
        e.printStackTrace();
    }
    new Thread(new Thread1()).start();
}
}

运行上面结果为:

进入线程2
进入线程1
线程1结束

我们修改Thread1类

package cn.yqg.day2;

public class Thread1 implements Runnable{

    @Override
    public void run() {
        
       synchronized(Test.class) {
       System.out.println("进入线程1");
       try {
        Thread.sleep(100);
        Test.class.notify();//Thread2结束挂起状态,进入就绪状态,等待运行
    } catch (InterruptedException e) {    
        e.printStackTrace();
    }
       System.out.println("线程1结束");
       }
    }
}

以上结果为:

进入线程2
进入线程1
线程1结束
结束线程2

------------------------------------------------------------------------------------------------------------------------------

总的来说,sleep不会释放对象的锁,wait()会释放对象的锁。

原文地址:https://www.cnblogs.com/zzuli/p/9381141.html