1什么是线程阻塞?
在某一时刻某一个线程在运行一段代码的时候,这时候另一个线程也需要运行,但是在运行过程中的那个线程执行完成之前,另一个线程是无法获取到CPU执行权的(调用sleep方法是进入到睡眠暂停状态,但是CPU执行权并没有交出去,而调用wait方法则是将CPU执行权交给另一个线程),这个时候就会造成线程阻塞。简单来说,若线程无法获取CPU时间片,处在等待中,则可以认为该线程被阻塞。
2为什么会出现线程阻塞?
1.睡眠状态:当一个线程执行代码的时候调用了sleep方法后,线程处于睡眠状态,需要设置一个睡眠时间,此时有其他线程需要执行时就会造成线程阻塞,而且sleep方法被调用之后,线程不会释放锁对象,也就是说锁还在该线程手里,等睡眠时间一过,该线程就会进入就绪状态(获得CPU时间片,则直接执行,因为拥有锁)。典型的“占着茅坑不拉屎”。
2.等待状态:当一个线程正在运行时,调用了wait方法,此时该线程需要交出CPU执行权,同时将锁释放出去,交给另一个线程,该线程进入等待状态,但与睡眠状态不一样的是,进入等待状态的线程不需要设置睡眠时间,但是需要执行notify方法或者notifyall方法来对其唤醒,自己是不会主动醒来的,等被唤醒之后,该线程