线程的stop方法和interrupt方法

创建测试需要的类

  • 新建一个类MyThread,继承Thread
public class MyThread extends Thread {
    public int x = 0;
    public int y = 0;

    @Override
    public void run() {
        //保证线程安全和原子性
        synchronized (this) {
            x++;
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            y++;
        }
    }

    /**
     * 打印x和y的值
     */
    public void printXAndY() {
        System.out.println("x=" + x);
        System.out.println("y=" + y);
    }
}

用stop方法来中止线程

测试用main方法如下:

public class TestMain {
    public static void main(String[] args) throws Exception {
        MyThread myThread = new MyThread();
        //线程就绪
        myThread.start();
        //主线程先睡眠一秒,方便myThread线程把x++运行完
        Thread.sleep(1000);
        //调用stop方法
        myThread.stop();
          //确保线程已经中止
        while (myThread.isAlive()) {
        
        }
        //打印x和y的值
        myThread.printXAndY();
    }
}

结果如下:
在这里插入图片描述
可以发现x的值是1,而y的值却是0。所以从这里可以了解到stop方法的暴力之处了,stop方法会直接把运行中的线程强行中止掉,造成数据不一致的问题,导致了线程安全的问题,所以jdk其实不建议使用。

使用interrupt方法中止线程

public class TestMain {
    public static void main(String[] args) throws Exception {
        MyThread myThread = new MyThread();
        //线程就绪
        myThread.start();
        //主线程先睡眠一秒,方便myThread线程把x++运行完
        Thread.sleep(1000);
        //调用interrupt方法
        myThread.interrupt();
        //确保线程已经中止
        while (myThread.isAlive()) {

        }
        //打印x和y的值
        myThread.printXAndY();
    }
}

运行结果如下:
在这里插入图片描述
可以发现在sleep方法抛出了一个异常后,x和y的值都是1,线程是安全的。

总结:

  • stop方法不建议使用,它可能会导致线程安全问题
  • interrupt方法不会出现强制中止的情况,会抛出一个异常,线程是安全的
发布了136 篇原创文章 · 获赞 109 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104089756