💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# wait和sleep的本质区别 先看一下他们的定义: **wait:**线程等待,调用该方法的线程进入 `WAITING` 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 `wait()`方法后,会释放对象的锁。因此,`wait` 方法一般用在同步方法或同步代码块中。 **sleep:**线程睡眠,`sleep` 导致当前线程休眠,与 `wait` 方法不同的是 `sleep` 不会释放当前占有的锁,`sleep(long)`会导致线程进入 `TIMED-WATING` 状态,而 `wait()`方法会导致当前线程进入 `WATING` 状态 1. 对于 sleep()方法,我们首先要知道该方法是属于 Thread 类中的。而 wait()方法,则是属于Object 类中的。 ![](https://img.kancloud.cn/db/e8/dbe8a688b24291e49d2e746e5e2b9feb_301x541.png) ![](https://img.kancloud.cn/01/9b/019bc0a2be8ea6782fa98a1545f05991_300x366.png) 2. sleep()方法导致了程序暂停执行指定的时间,让出 cpu 该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。 3. sleep()使用时不需要使用syncronized加上同步锁,但是wait()需要。 ```java /** * @program: ThreadDemo * @description: wait和sleep的本质区别 * @author: hs96.cn@Gmail.com * @create: 2020-09-07 */ public class DifferenceOfWaitAndSleep { public static final Object LOCK = new Object(); public static void main(String[] args) { m1(); m2(); } // 休眠2秒正常结束 public static void m1() { try { Thread.sleep(2_000); } catch (InterruptedException e) { e.printStackTrace(); } } public static void m2() { try { LOCK.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 运行效果如下: ![](https://img.kancloud.cn/bf/e1/bfe1860812b11ccfb127b728ae1e8ddd_1154x456.gif) 4.sleep()时不会释放同步锁,但是wait()会释放。 我们先试一下啊sleep ```java public class DifferenceOfWaitAndSleep { public static final Object LOCK = new Object(); public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable() { @Override public void run() { m1(); } }).start(); } } public static void m1() { synchronized (LOCK){ try { System.out.println(Thread.currentThread().getName()); Thread.sleep(3_000); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 运行效果如下: ![](https://img.kancloud.cn/e9/4b/e94b05d20f5bb96035e6455c218e205c_1154x456.gif) 可以看到sleep()时不会释放同步锁。那么wait呢? ```java public class DifferenceOfWaitAndSleep { public static final Object LOCK = new Object(); public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable() { @Override public void run() { m1(); } }).start(); } } public static void m1() { synchronized (LOCK){ try { System.out.println(Thread.currentThread().getName()); LOCK.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 运行效果如下: ![](https://img.kancloud.cn/4f/46/4f46aaf0c94f2e94af1df0484f28be2d_1154x456.gif) 可以看到几乎是同时执行的,也就是wait()会释放锁。