调用Thread.sleep方法会使得线程进入限期等待状态,常常用“使一个线程睡眠”描述
调用object.wait(xxx) 方法使得线程进入限期等待,常常用“挂起一个线程”描述
睡眠和挂起是一个动作,阻塞和等待是一个状态
阻塞和等待的区别在于,阻塞是一个被动的,它是在等待一个排它锁;等待(无论来自于sleep还是wait)是一个主动的,通过主动调用方法进入的
另外:
Blocking、Waiting、Timed_Waiting这几种状态可以统一理解为休眠状态,当线程处于这几种状态时,线程是没有cpu的使用权的。
Callable实现返回值,futureTask实现异步
interrupt作为一种线程交互的方式,相比stop温柔多了。对于被interrupt的线程,如果想要接收通知,有以下2种方式:
当线程处于 Waiting、Timed_Waiting状态时,如果其他线程调用线程A的interrupt方法,会使线程A返回到Runnable状态,同时线程A的代码会触发InterruptException异常。我们在调用wait、join、sleep方法,都能看的这些方法都会throws interruptException,这个异常的触发条件就是其他线程调用该线程的interrupt方法
当线程A处于Runnable,并且阻塞在java.io.channels.interruptiableChannel上时,如果其他线程调用A的interrupt方法,线程A会触发java.nio.channels.ClosedByinterruptException;而阻塞在java.nio.channels.Selector上时,如果其他线程调用线程A的interrupt方法,线程A会立即返回
通过主动检测 thread.isInterupted方法,来判断自己是否被中断了