线程的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方法不会出现强制中止的情况,会抛出一个异常,线程是安全的
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值