/* *
- @Created with IntelliJ IDEA.
- @Description: 中断:把一个正在执行的线程,紧急停止下来,典型的两种实现方法:
-
一、通过一个标记位的形式来进行中断。
-
标记位的终止方法比较温和,必须要每次线程内部主动检查的时候,才会触发终止操作。
-
二、借助 interupt 方法进行中断。
-
这个方法并不是直接把线程中断掉,而是让线程内部抛出一个InterruptException异常,
-
至于代码中如何处理这个异常,就是程序员自身考虑的事。
*/
public class ThreadDemo {
// 这个变量用来表示当前线程是否为退出的状态
private static boolean isQuit = false;
public static void main(String[] args) throws InterruptedException {
// 一、通过一个标记位的形式来进行中断。
Thread thread1 = new Thread() {
@Override
public void run() {
while (!isQuit) {
System.out.println("我正忙着转账呢!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("转账被终止!");
}
};
thread1.start();
Thread.sleep(5000);
System.out.println("对方是内鬼,终止交易!");
isQuit = true;
}
/*
二、借助 interupt 方法进行中断。
1.如果是通过继承Thread 的方式来创建出来的线程,
此时 currentThread() 操作相当于this.
2.如果是通过实现Runnable/lambda方式来创建线程,
此时必须通过currentThread()才能回到当前线程的实力
*/
public static void main1(String[] args) throws InterruptedException {
Thread thread2 = new Thread() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("我正忙着交易呢!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//e.printStackTrace();
break;
// t.interrupt() 会让 t 这个线程内部触发一个异常,
// 当捕捉到这个异常的时候,就可以让循环结束。
}
}
System.out.println("交易被警察打断!");
}
};
thread2.start();
Thread.sleep(5000);
System.out.println("条子来了,终止交易!");
thread2.interrupt();
}
}