线程中止:
错误的中止:使用线程的stop(),线程stop()方法会强制性中止,破坏线程安全;
正确的中止:(1)使用interrupt()方法。
如果目标线程在调用Object类的wait()、wait(long)、或者wait(long,int)方法、join()、join(long,int)
或sleep(long,int)方法时被阻塞,那么interrupt方法就会生效,该线程的中断状态会被清除,抛出
InterruptException异常。
如果目标线程是被I/O或NIO中的Channel所阻塞,那么,I/O操作会被中断或者返回特殊异常值,达到
线程中止的目的。
如果以上条件均不满足,就会设置此线程的中断状态。(通过实践,感觉该状态的设置并不准确)
对于Demo3中的示例,stop()改成interrupt()之后,最终输出:i=1,j=1,数据一致。
(2)通过状态位去中止线程的执行
示例如下:
public class StopThread extends Thread {
private int i = 0, j = 0;
@Override
public void run() {
synchronized (this) {
// 增加同步锁,确保线程安全
++i;
try {
// 休眠10秒,模拟耗时操作
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
++j;
}
}
/** * 打印i和j */
public void print() {
System.out.println("i=" + i + " j=" + j);
}
}
/**
* 示例3 - 线程stop强制性中止,破坏线程安全的示例
*/
public class Demo3 {
public static void main(String[] args) throws InterruptedException {
StopThread thread = new StopThread();
thread.start();
// 休眠1秒,确保i变量自增成功
Thread.sleep(1000);
// 暂停线程
thread.stop(); // 错误的终止,输出结果 i=1,j=0
//System.out.println("线程执行interrupted前的状态:" + thread.isInterrupted());
// thread.interrupt(); // 正确终止,输出结果 i=1,j=1
//System.out.println("线程执行interrupted后的状态:" + thread.isInterrupted());
while (thread.isAlive()) {
// 确保线程已经终止
} // 输出结果
thread.print();
}
}
/** 通过状态位来判断 */
public class Demo4 extends Thread {
public volatile static boolean flag = true;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
try {
while (flag) { // 判断是否运行
System.out.println("运行中");
Thread.sleep(1000L);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
// 3秒之后,将状态标志改为False,代表不继续运行
Thread.sleep(3000L);
flag = false;
System.out.println("程序运行结束");
}
}