interrupt()
interrupt()不会中断一个正在运行的线程,而是设置中断标识,然后交给应用程序,有应用程序判断怎么处理。
如果该线程阻塞的调用wait() , wait(long) ,或wait(long, int)的方法Object类,或者在join() , join(long) , join(long, int) , sleep(long) ,或sleep(long, int) ,这个类的方法,那么它的中断状态将被清除,并且将收到一个InterruptedException 。
上面简单讲就是,线程阻塞时,上面的可中断的阻塞方法会不断检查自己的中断状态,如果有interrupt来了,就马上抛出一个InterruptedException,同时清除中断标识。 为了提前结束自己的阻塞状态。
如何中断线程呢?
两种完美方法:
1 传递中断。
子函数抛出中断异常,不要吞掉异常。
2 恢复中断。
在不能传递或者不想中断,在try…catch中 恢复中断。
public class RightWayStopThreadPro implements Runnable{
@Override
public void run() {
while (true && !Thread.currentThread().isInterrupted()){
System.out.println("niu bi");
try {
throwMethod();
} catch (InterruptedException e) {
System.out.println("执行中断前操作。。。");
System.out.println("打印日志。。。");
e.printStackTrace();
// break;
Thread.currentThread().interrupt