1、volatile
private static volatile boolean stopFlag = false;//默认不中断
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
while (!stopFlag) {
System.out.println("线程1在执行");
}
});
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
stopFlag = true;
}).start();
}
2、AtomicBoolean
private static AtomicBoolean stopFlag = new AtomicBoolean(false);//默认不中断
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
while (!stopFlag.get()) {
System.out.println("线程1在执行");
}
});
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
stopFlag.set(true);
}).start();
}
3、Interrupt
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("线程1在执行");
}
});
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
t1.interrupt();
}).start();
}
4、stop
注意stop和interrupt之间的问题:
stop是强制中断,而interrupt不是直接中断,而是做一个中断标识,会做好相关收尾工作再中断。
比如对于一个线程a,当其他线程调用了a的interrupt方法,如果a中在执行wait、sleep等方法,会抛出InterruptedException异常,然后中断。反观stop则会直接中断。
举例说明stop引发问题:
stop对于hashmap扩容直接中断,可能引起数据结构错误。
stop对于io流直接中断,没有正常close关流,会导致内存溢出。