在Java中的多线程是一个抢占式的机制, 而不是分时机制。抢占式机制是有多个线程处于可运行状态, 但是只有一个线程处于运行状态.
共同点
-
他们都是在多线程环境下, 可以指定线程阻塞时间的操作, 并返回.
-
wait()和sleep()都可以通过线程实例的
interupt
方法打断暂停的状态, 从而使线程能够立即抛出InteruptedException
的异常.
NOTE: 线程的
interupt
的方法, 并不会跑出InteruptedException
的异常, 该异常是由线程内部跑出的。如果该线程正在执行正常的业务逻辑, 则可以继续执行。只有在执行wait/join/sleep
方法的时候, 会立即抛出InteruptedException
的异常信息.
不同点
-
每一个对象都有一个锁来控制同步访问,
synchronized
关键字可以和对象锁交互, 来实现线程的同步 -
sleep()
方法在调用时, 没有释放锁.wait()
方法释放了锁, 让其他线程可以进入同步块执行逻辑 -
wait
,notify
,notifyAll
只能在同步方法或者同步代码块中执行.sleep
可以在任何地方执行 -
sleep
必须捕获异常;wait
,notify
,notifyAll
不用捕获异常 -
sleep
是线程Thread
方法, 导致线程暂停执行指定时间, 给其他线程执行的机会. 但是监控状态依然保持, 到时候状态会自动恢复。 -
wait
是Object
方法, 调用该对象, 会导致线程放弃当前已经持有的对象锁, 进入当前对象的等待锁定池
. 只有对这个对象发送notify
或者notifyAll
后才能从对象等待锁定池准备获取对象锁进入可运行状态。
文章评论