1.
一个线程进入阻塞状态,可能有如下原因:
你通过调用 sleep(milliseconds) 使线程进入休眠状态,在这种情况下, 线程在指定的时间内不会运行。
你通过调用 wait( ) 使线程挂起。直到线程得到了 notify( ) 或 notifyAll( ) 消息,线程才会进入就绪状态。
线程在等待某个输入 / 输出完成。
) 和 notifyAll( ) (因为不用 操作锁,所以 sleep( ) 可以在非同步控制方法里调用)。如果你在非同步控制方法里调用 这些方法,程序能通过编译,但运行的时候,你将得到 IllegalMonitorStateException 异常,伴随着一些含糊的消息,比如 “ 当前线程不是拥有者 ” 。消息的意思是,调用 wait( ), notify( ) 和 notifyAll( ) 的线程在调用这些方法前必须 “ 拥有 ” (获取)对象的锁。
你通过调用 sleep(milliseconds) 使线程进入休眠状态,在这种情况下, 线程在指定的时间内不会运行。
你通过调用 wait( ) 使线程挂起。直到线程得到了 notify( ) 或 notifyAll( ) 消息,线程才会进入就绪状态。
线程在等待某个输入 / 输出完成。
线程试图在某个对象上调用其同步控制方法,但是对象锁不可用。
2.调用sleep( )的时候锁并没有被释放,理解这一点很重要。另一方面,wait( )方法的 确释放了锁,这就意味着在调用wait( )期间,可以调用线程中对象的其他同步控制方法。 当一个线程在方法里遇到了对wait( )的调用的时候,线程的执行被挂起,对象上的锁被 释放。
3.wait( ), notify( ),以及notifyAll( )的一个比较特殊的方面是这些方法是基类 Object的一部分,而不是像Sleep( )那样属于Thread的一部分。
) 和 notifyAll( ) (因为不用 操作锁,所以 sleep( ) 可以在非同步控制方法里调用)。如果你在非同步控制方法里调用 这些方法,程序能通过编译,但运行的时候,你将得到 IllegalMonitorStateException 异常,伴随着一些含糊的消息,比如 “ 当前线程不是拥有者 ” 。消息的意思是,调用 wait( ), notify( ) 和 notifyAll( ) 的线程在调用这些方法前必须 “ 拥有 ” (获取)对象的锁。
5.有时线程会阻塞,比如在等待输入的时候。这时,你可以使用Thread对象的interrupt( )方法来跳出阻塞代码。