中断线程

interrupt的作用是终断本线程,stop和suspend是固有不安全的,所以禁止使用。

线程处于阻塞状态,调用interrupt,终断标志会被设置成true,由于线程处于阻塞状态,该终断标记会被立即清楚设置为false,并抛出interruptedException


终止处于阻塞状态的线程:

@Override

publicvoid run() {

    while(true) {

        try {

            // 执行任务...}catch (InterruptedException ie) { 

            // InterruptedException在while(true)循环体内。

            // 当线程产生了InterruptedException异常时,while(true)仍能继续运行!需要手动退出break;

        }

    }

}

终止运行状态的线程:

@Override

publicvoid run() {

    while(!isInterrupted()) {

        // 执行任务...    }

}

通过isInterrupted判断是否中断,没有中断就继续运行,为了更好的控制逻辑可以增加标志位来控制中断

比较通用的终止线程的方式:

@Override

public void run() {

    try {

        // 1. isInterrupted()保证,只要中断标记为true就终止线程。

        while (!isInterrupted()) {

            // 执行任务...

        }

    } catch (InterruptedException ie) { 

        // 2. InterruptedException异常保证,当InterruptedException异常产生时,线程被终止。

    }

}

最后谈一谈interrupted和isinterrupted的区别,俩个都返回终断状态的标志,前者会清除终断标志

你可能感兴趣的:(中断线程)