Java如何正确终止线程

javaAPI中提供了如下几个方法:
stop()、suspend()、stop()、interrupt()、interrupted()几个方法,其中stop()和suspend()是java的废弃方法
在这里插入图片描述
那么为什么这两个方法被被废弃了呢?
stop():强行停止指定的正在运行的方法,会导致线程中的资源不能进行正确的处理和释放,从而使程序输出意想不到的结果。
suspend():线程暂停,达到一个sleep的状态,调用这种方法后,线程会进入阻塞状态,不会释放资源,容易导致线程死锁。

那么如何正确停止的当前正在运行的线程呢?一般常用的有两种方式,Boolean型的标志位和interrupt方法
1、通过Boolean标志位的方式,在循环当中加入一个布尔型的标志位,然后在需要中断的地方,将当前的标志位置为false,可以达到中断当前线程的目的。例如:

private static volatile boolean isStop;

	public static void main(String[] args) throws InterruptedException {
		MyTestThread1 myThread = new MyTestThread1();
		myThread.start();
		myThread.sleep(200);
		isStop = true;
	}

	static class MyTestThread1 extends Thread {
		public void run() {
			super.run();
			while (!isStop) {
				System.out.println("thread is running");
			}
		}
	}

2、interrupt方法和isInterrupted、interrupted检测线程中断状态
interrupt方法:会将当前线程的中断标志位置为false,但并不会立即使线程中断
isInterrupted方法:检测线程中断状态,不会重置线程中断状态
interrupted方法:检测线程中断状态,静态方法,会重置线程中断状态,当第一次返回true后,会将线程中断状态重新置为false

3、如何使用interrupt方法中断线程呢?例如下面代码

public static void main(String[] args) throws InterruptedException {
		MyTestThread myTestThread = new MyTestThread();
		myTestThread.start();
		myTestThread.sleep(100);
		myTestThread.interrupt();
	}
	static class MyTestThread extends Thread {
		public void run() {
			super.run();
			while (!isInterrupted()) {
				System.out.println("thread is running");
			}
			System.out.println("interrupt flag == " + isInterrupted());
		}
	}

执行结果:
Java如何正确终止线程_第1张图片
用interrupt和isInterrupted来中断和检测线程中断时需要注意如下两点
(1)、上面的例子创建线程的方法是继承Thread类,isInterrupted方法是Thread类中的方法,那么如果我们是实现Runnable接口该如何使用isInterrupted方法呢?

public static void main(String[] args) throws Exception {
        Thread thread = new Thread(new MyTestThread());
        thread.start();
        thread.sleep(500);
        thread.interrupt();
    }
    static class MyTestThread implements Runnable {
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                // isInterrupted是Thread类中的方法 所以不能直接调用 需要通过Thread.currentThread来调用
                System.out.println("myTestThread is Running");
            }
            System.out.println("interrupted flag is == "
                    + Thread.currentThread().isInterrupted());
        }
    }

(2)、另外需要注意的是,当我们使用interrupt方法中断线程时,如果线程内部代码报InterruptException异常时,就不能正常对线程进行中断,需要在catch中,重新调用interrupt方法,例如:

public static void main(String[] args) throws InterruptedException {
        MyTestThread myTestThread = new MyTestThread();
        myTestThread.start();
        myTestThread.sleep(200);
        myTestThread.interrupt();
    }
    static class MyTestThread extends Thread {
        public void run() {
            super.run();
            while (!isInterrupted()) {
                System.out.println("myTestThread is running");
                try {
                    sleep(500);
                } catch (InterruptedException e) {
                    interrupt();// 如果程序抛出interruptedException异常,需要在catch中重新interrupt中断一次
                    e.printStackTrace();
                }
                System.out.println("interrupt flag == " + isInterrupted());
            }
        }
    }```

你可能感兴趣的:(Java基础_多线程)