java · 20 4 月, 2021 0

线程wait和sleep

在Java中的多线程是一个抢占式的机制, 而不是分时机制。抢占式机制是有多个线程处于可运行状态, 但是只有一个线程处于运行状态.

共同点

  1. 他们都是在多线程环境下, 可以指定线程阻塞时间的操作, 并返回.

  2. wait()和sleep()都可以通过线程实例的interupt方法打断暂停的状态, 从而使线程能够立即抛出InteruptedException的异常.

NOTE: 线程的interupt的方法, 并不会跑出InteruptedException的异常, 该异常是由线程内部跑出的。如果该线程正在执行正常的业务逻辑, 则可以继续执行。只有在执行wait/join/sleep方法的时候, 会立即抛出InteruptedException的异常信息.

不同点

  1. 每一个对象都有一个锁来控制同步访问, synchronized关键字可以和对象锁交互, 来实现线程的同步

  2. sleep()方法在调用时, 没有释放锁. wait()方法释放了锁, 让其他线程可以进入同步块执行逻辑

  3. wait, notify, notifyAll只能在同步方法或者同步代码块中执行. sleep可以在任何地方执行

  4. sleep必须捕获异常; wait, notify, notifyAll不用捕获异常

  5. sleep是线程Thread方法, 导致线程暂停执行指定时间, 给其他线程执行的机会. 但是监控状态依然保持, 到时候状态会自动恢复。

  6. waitObject方法, 调用该对象, 会导致线程放弃当前已经持有的对象锁, 进入当前对象的等待锁定池. 只有对这个对象发送notify或者notifyAll后才能从对象等待锁定池准备获取对象锁进入可运行状态。