首先,如果是IO阻塞,普通方法无法终止线程,第二,如果线程是因为调用wait,sleep等方法而进入阻塞状态,可以使用中断线程,并且抛出InterruptedException异常来唤醒它。
对阻塞方法的大致分类:
(1)会抛出InterruptedException的方法:wait、sleep、join、Lock.lockInterruptibly等,针对这类方法,我们在线程内部处理好异常(要不完全内部处理,要不把这个异常抛出去),然后就可以实现唤醒。
(2)不会抛InterruptedException的方法:Socket的I/O,同步I/O,Lock.lock等。对于I/O类型,我们可以关闭他们底层的通道,比如Socket的I/O,关闭底层套接字,然后抛出异常处理就好了;比如同步I/O,关闭底层Channel然后处理异常。对于Lock.lock方法,我们可以改造成Lock.lockInterruptibly方法去实现。