线程响应中断

首先介绍下Thread的两个方法:

  • interrupt():设置当前中断标记为true
  • isInterrupted():检查线程的中断标记
@Slf4j
public class StopThread implements Runnable {

    public static void main(String[] args) throws InterruptedException {
        Thread thread =new Thread(new StopThread());
        thread.start();
        log.debug("main Thread");
        thread.interrupt();
        log.debug("调用interrupt后是否中断" + thread.isInterrupted());
        log.debug("调用interrupt后thread是否存活:" + thread.isAlive());
        Thread.sleep(1000);
        log.debug("Thread end后是否中断:" + thread.isInterrupted());
        log.debug("Thread end后是否存活:" + thread.isAlive());
    }

    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            log.debug("i = "+i);
        }
        log.debug("Thread end");
    }
}

输出:

i = 1
i = 2
....
i = 6
 main Thread
 i = 7
 ...
 i = 9
调用interrupt后是否中断true
i = 10
调用interrupt后thread是否存活:true
Thread end
Thread end后是否中断:false
Thread end后是否存活:false

由输出我们可以看出执行Thread.interrupt()方法,并不是中断线程,只是改变其标志位,如果需要通过标志位来达到中断线程的要求,将Runable改为:

@Override
    public void run() {
        for (int i = 1; i <= 10 && !Thread.currentThread().isInterrupted(); i++) {
            log.debug("i = "+i);
        }
        log.debug("Thread end");
    }

输出:

i = 1
main Thread
i = 2
Thread end
调用interrupt后是否中断true
调用interrupt后thread是否存活:false
Thread end后是否中断:false
Thread end后是否存活:false

通过检查线程中断标志位来终止线程。

更多文章:
CSDN博客
简书博客
公众号:代码小搬运
代码小搬运.jpg

你可能感兴趣的:(Java开发,#,线程)