Java中如何安全终止一个线程?

在最初的JDK版本中,Thread类提供了一个线程终止的方法stop()方法,但是现在在JDK源码中发现,stop()方法已经被废弃。主要原因是:stop()方法太过暴力。强制终止一个正在执行的线程。这样的话会造成一些数据不一致的问题。

 

现在常用的是线程中断的方法:严格的讲,线程中断不会使线程立即退出,而是给线程发送一个通知,告诉目标线程,有人需要你退出啦!至于目标线程接到通知后如果处理,则完全由目标线程自行决定。这点很重要,如果中断后,线程立即无条件退出,我们又会遇到stop()的老问题。

与线程中断有关的三个方法

public void Thread.interrupt()        //中断线程
public boolean Thread.isInterrupted() //判断线程是否中断
public static boolean Thread.interrupted() //判断是否被中断,并清除当前中断状态

Thread.interrupt()方法是一个实例方法,它通知目标线程中断,也是设置中断标志位。中断标志位表示当前线程已经被中断了。

Thread.isInterrupted() 方法也是实例方法,主要是检查当前线程是否被中断(通过检查中断标志位),返回值是boolean类型。

Thread.interrupted() 方法也是用来判断当前线程是否被中断,但同时清除当前线程的中断标志位状态。

 

但是,如果我们单独的去调用Thread.interrupt()并不会去中断一个线程。比如下面的代码:

/**
 * **     单独调用Interrupted并不会终止线程*****
 * 
 * Created by songyangguang on 2018/7/20.
 */
public class InterruptedDemo {

    public static void main(String[] args) {
        Thread t1 = new Thread() {

            @Override
            public void run() {
                while(true) {
                    System.out.println("The thread is waiting for interrupted!");
                    //Thread.yield();
                }
            }
        };
        t1.start();
        t1.interrupt();//中断线程
        System.out.println("The Thread is interrupted!");
    }
}

运行后会发现,线程并没有并中断,而是一直指向下去。

Java中如何安全终止一个线程?_第1张图片

原因:这上面的这个程序中,虽然对程序进行了中断,但是并没有进行中断处理逻辑。因此,t1线程被置为中断状态,但是这个没有中断处理逻辑程序的话,这个中断不会发生任何的作用。

           所以,可以将上面的代码增加中断处理逻辑代码。如下:

/**
 * **     单独调用Interrupted并不会终止线程*****
 *
 * Created by songyangguang on 2018/7/20.
 */
public class InterruptedDemo {

    public static void main(String[] args) {
        Thread t1 = new Thread() {

            @Override
            public void run() {
                while(true) {
                    System.out.println("The thread is waiting for interrupted!");
                    //中断处理逻辑
                    if(Thread.currentThread().isInterrupted()) {
                        System.out.println("The thread is interrupted!");
                        break;
                    }
                    //Thread.yield();
                }
            }
        };
        t1.start();
        t1.interrupt();//中断线程
        //System.out.println("The Thread is interrupted!");
    }
}

因此,通过上面的代码就可以看到,使用Thread.interrupt()方法处理现场中断,需要使用Thread.isInterrupted()判断线程是否被中断,然后进入中断处理逻辑代码。

你可能感兴趣的:(Java并发编程,Java面试总结)