(三)线程的终止

2020-03-11  本文已影响0人  覆水无言

Java多线程目录

前提

刚接触线程时一直想怎么立刻停止线程,现在了解了,对于现在电脑来说,立刻终止线程会造成各种各样的问题,所以在Java中,线程的终止就是为了让线程自动执行完,下面终止线程的方法最终目的都是这样。

中断

中断是当前线程的一个标志位,在线程内外的表现就是true/false,
中断的三个方法

public void interrupt();   //设置中断
public boolean isInterrupted();  //只判断标记位
public static boolean interrupted();  //静态方法,判断标记为并清除标记位

这里在实例中说明这三个方法

public class ThreadOne extends Thread{
    @Override
    public void run() {
        super.run();
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println("1::" + Thread.currentThread().isInterrupted());
        }
        System.out.println("线程结束1:" + Thread.currentThread().isInterrupted());

        System.out.println("线程结束2:" + Thread.interrupted());
        System.out.println("线程结束3:" + Thread.interrupted());
    }

    public static void main(String[] args) {

        ThreadOne one = new ThreadOne();
        one.start();

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        one.interrupt();
    }
}

输出:

1::false
1::false
1::false
1::false
线程结束1:true
线程结束2:true
线程结束3:false

这样就可以安全的利用中断来停止我们的线程。
注意:中断并不会立即停止我们的线程,它只会设置标志位,来让线程主动检测,后我们自己设置线程停止返回逻辑。

自己设置标记位

和中断思路一样,我们自己设置标记为是一样的效果。

public class ThreadOne extends Thread {

    private volatile boolean end = false;
    @Override
    public void run() {
        super.run();

        while (!end) {
            System.out.println("1::" + end);
        }
        System.out.println("线程结束1:" + end);
    }

    public void cancle(){
        this.end = true;
    }

    public static void main(String[] args) {

        ThreadOne one = new ThreadOne();
        one.start();

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        one.cancle();
    }
    
}

上一篇 下一篇

猜你喜欢

热点阅读