首先
一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以Thread.stop,Thread.suspend,Thead.resume都已经被废弃了。
其次
在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。
因此,Java提供了一种用于停止线程的协商机制一中断,也即中断标识协商机制。
中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设成true;接着你需要自己写代码不断地检测当前线程的标识位,如果为true,表示别的线程请求这条线程中断,此时究竟该做什么需要你自己写代码实现。
每个线程对象中都有一个中断标识位,用于表示线程是否被中断;该标识位为true表示中断,为false表示未中断:通过调用线程对象的interrupt方法将该线程的标识位设为true: 可以在别的线程中调用,也可以在自己的线程中调用。
中断的相关API方法之三大方法说明。
方法一:
public void interrupt() 实例方法interrupt()仅仅是设置线程的中断状态为true,发起一个协商而不会立刻停正线程。
① 如果线程处于正常活动状态,那么会将该线程的中断标志设置为 true,仅此而已。
被设置中断标志的线程将继续正常运行,不受影响。
所以, interrupt) 并不能真正的中断线程,需要被调用的线程自己进行配合才行。
②如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),在别的线程中调用当前线程对象的interrupt方法,那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。
③如果该线程阳塞的调用wait(), wait(long)或wait(long, int)的方法0bject类的join(), join(long),join(long, int),sleep(long), 或sleep(long, int),这个类的方法,那么它的中断状态将被清除(设置为false),并目将收到InterruptedException
方法二:
public static boolean interrupted() 静态方法,Thread.interrupted():判断线程是否被中断并清除当前中断状态(就是把中断标志改完false)。这个方法做了两件事。
返回当前线程的中断状态,测试当前线程是否已被中断
将当前线程的中断状态清零并重新设置为false,清楚线程的中断状态
方法三:
public boolean islnterrupted() 实例方法,判断当前线程是否被中断(通过检查中断标志位)