多线程
中断
每个线程都有一个boolean类型的中断状态。当在另一个线程中断该线程时,这个线程的中断状态将被设置为true。
Thread类提供了中断线程以及查询线程中断状态的方法:
interrupt方法能中断目标线程。
isInterrupted方法能返回目标线程的中断状态。
interrupted方法将清除当前线程的中断状态,并返回它之前的值。该方法也是清除中断状态的唯一方法。
线程中断时一种协作机制,线程可以通过这种机制来通知另一个线程,告诉它在合适的或者可能的情况下停止当前工作。但是调用interrupt并不意味着立即停止目标线程正在进行的工作,而只是传递了请求中断的消息。
如果一个线程在阻塞状态下(例如线程调用了Thread.sleep和Object.wait方法等),会检查线程是否被中断,如果被中断了则 1. 清除中断状态,抛出InterruptedException表示阻塞操作由于中断而提前结束。JVM并不保证阻塞方法检测到中断的速度,但实际情况下响应速度还是非常快的。
总结
中断并不会真正的中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时刻中断自己。
Java线程的实现
- Java在JDK1.2之前,是基于称为”绿色线程“的用户线程实现的,JDK1.2版本中,线程模型替换为基于操作系统原生线程模型来实现的。
- 线程模型对线程的并发规模和操作成本产生影响,对Java程序的编码和运行过程来说,这些差异都是透明的。
- 不同平台的线程模型是不一样的,对于Sun JDK来说,它的Windows版和Linux版都是使用一对一的线程模型实现的,而在Solaris平台中,支持一对一
的线程模型,也支持多对多的线程模型,提供相应的虚拟机的参数配置。