创建测试需要的类
- 新建一个类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方法不会出现强制中止的情况,会抛出一个异常,线程是安全的