线程中断的方式我在这篇文章多线程基本操作有解释过。这篇文章单独抽离出来
共享变量的方式
public class MyThread implements Runnable {
//使用volatile关键字可以做到变量的可见性,后续会详细的解释
static volatile boolean flag = false;
@Override
public void run() {
while (true){
System.out.println("正在执行");
if(flag){
break;
}
}
}
public static void main(String[] args) {
new Thread(new MyThread()).start();
try {
Thread.sleep(2000);//主线程睡眠确保另一个线程先执行
flag = true; //修改变量的值
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
该方法注意事项:
使用变量中断的话,该变量需要用volatile关键字修饰,保证变量的可见性
使用Thread提供的方法
void interrupt() //中断线程
static boolean interrupted() //测试当前线程是否已经中断
boolean isinterrupted() //测试线程是否已经中断
线程中断返回true,否则返回false
用法详细解释
interrupt()方法作为一个实例方法
通知目标线程中断(将线程的中断标志设置为true)
如果线程在调用Object类的wait()…方法或者目标线程的join(…)、sleep(…)方法时
会抛出InterruptedException,并将中断状态清除(中断状态设为false)!!!
isinterrupted()方法是一个实例方法,判断当前线程是否中断(查看中断标志true(中断)\false(未中断))
interrupted()方法是一个静态方法,也用来判断当前线程是否中断,但是和isinterrupted不同的是,它会清除中断状态(置为false)。
换句话说:中断状态可以由interrupted清除,连续调用两次interrupt方法会返回false.
//interrupt()中断线程演示
public class MyThread implements Runnable {
@Override
public void run() {
while (true){ //定义一个死循环,使用线程中断来结束循环。
System.out.println("正在执行");
if(Thread.interrupted()){ //判断该线程是否是中断线程
break;
}
}
}
public static void main(String[] args) {
Thread thread = new Thread(new MyThread());
try {
thread.start();
Thread.sleep(2000);//保证那个线程先执行
thread.interrupt();//线程中断,设置中断状态为true
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
线程阻塞时使用:
public class MyThread implements Runnable {
@Override
public void run() {
while (true){ //定义一个死循环,使用线程中断来结束循环。
System.out.println("正在执行");
try {
Thread.sleep(2000);//保证那个线程先执行
} catch (InterruptedException e) {
e.printStackTrace();
this.interrupt();
}
if(Thread.interrupted()){ //判断该线程是否是中断线程
break;
}
}
}
public static void main(String[] args) {
Thread thread = new Thread(new MyThread());
try {
thread.start();
thread.interrupt();//线程中断,设置中断状态为true
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
注意事项:sleep抛出InterruptException异常后,会将该线程的中断状态清除即设置为false;因此需要在异常中再次调用interrupt()方法一次。
切记:
Thread.interrupted()方法以及sleep发生异常抛出的interruptException异常都会清除中断标记。