1、线程的停止方法

我们在之前的博客提到过,线程怎么创建。

线程池:

创建和启动线程:

这次我们主要介绍怎么停止线程。主要有两种方法:

  1. 调用stop方法停止。  方法已过时,不建议采用。且这种停止线程的方式,不能达到预期的效果。
  2. 使用线程的interrupt停止。有两种,一种是检查到interrupt为true时,主动停止。第二种是当线程处于阻塞状态时,调用interrupt()方法的时候,会抛出一个InterruptException,并且结束线程的等待状态,直接跳转到异常处理的代码块。

2、interrupt的用法

先来看下interrupt的用法

  1. interrupt:置线程的中断状态
  2. isInterrupt:线程是否中断
  3. interrupted:返回线程的上次的中断状态,并清除中断状态

可以看到,interrupt是设置线程状态的,而isInterrupt和interrupted是获取interrupt是否为true。

3、怎么使用interrupt?

1、检查状态,主动停止。

线程处于无限循环中,当检查到interrupted为true,主动break;

package com.test;

public class ThreadTest1 {
    public static void main(String[] args){
        Thread thread1 = new Thread(() -> {
            int i = 1;
            while (true) {
                if (Thread.currentThread().isInterrupted()){
                    System.out.println("isInterrupted");
                    break;
                }
                System.out.println("i=" + i++);
            }
        });

        thread1.start();

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread1.interrupt();
    }
}

回显:

i=1
...
i=140042
i=140043
i=140044
i=140045
i=140046
i=140047
isInterrupted

2、抛出一个InterruptException,并且结束线程的等待状态。

线程处于sleep状态,当调用interrupt时,直接抛出InterruptedException异常。

package com.test;

public class ThreadTest3 {
    public static void main(String[] args){
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                long startTime = System.currentTimeMillis();
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    long stopTime = System.currentTimeMillis();
                    System.out.println(stopTime-startTime);
                    System.out.println("InterruptedException");
                }
            }
        });
        thread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println("InterruptedException1");
        }
        thread.interrupt();
    }
}

回显:

994
InterruptedException

 

更多内容请关注微信公众号“外里科技

java多线程 ———— 线程停止_多线程