/** * Sleep、WaitDemo * * @author suntao * @history 2020-02-11 14:30 suntao 新建 * @since JDK1.8 */ public class SleepWaitDemo { /** * sleep和wait的区别 * 1、sleep是Thread的方法,wait是Object类中的防范 * 2、sleep在任何地方都可以调用,wait只有在sychronized方法或sychronized块中进行使用; * 3、Thread.sleep只会让出cpu,不会导致对象锁的行为的改变; * Object.wait不仅可以让出cpu,也会释放锁 * @param args */ public static void main(String[] args) { Object lock = new Object(); new Thread(new Runnable() { @Override public void run() { System.out.println("Thread A wait get lock."); synchronized (lock){ System.out.println("Thread A get lock."); try { Thread.sleep(20); // 休眠20ms,模拟业务逻辑处理 System.out.println("Thread A do wait method.释放对象锁"); lock.wait(1000); // 对象锁等待,释放对象锁 System.out.println("Thread A is done."); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); try { // 确保Thread A 先执行,占用对象锁,以验证lock.wait可以释放对象锁 Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(new Runnable() { @Override public void run() { System.out.println("Thread B wait get lock."); synchronized (lock){ System.out.println("Thread B get lock."); try { Thread.sleep(10); // 休眠10ms,模拟业务逻辑处理 System.out.println("Thread B is done."); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }