interrupt():将调用该方法的线程标记为终止阻塞状态,标记为终止阻塞状态后,如果该方法中遇到wait()、join()、sleep()方法导致线程阻塞,线程阻塞将被终止,并抛出InterruptedException异常,捕获异常后,线程可以继续运行,但如果不捕获异常,线程将无法继续运行。
isInterrupted():判断调用该方法的线程是否被标记成了阻塞状态。
interrupted():Thread类的静态方法,判断当前线程是否被标记成了阻塞状态,该方法在判断完毕后会取消当前线程的终止阻塞标记。
Demo1:
使用interrupt()方法将新开辟线程标记为终止阻塞状态,并使用isInterrupted()方法判断线程的标记状态。
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 1、使用sleep测试interrupt()
System.out.println("thread线程 开始 执行");
try {
Thread.sleep(2000);
System.out.println("当前线程完成了第一次2秒休眠");
} catch (InterruptedException e) {
System.out.println("thread线程 第一次休眠 被终止");
}
System.out.println("thread线程 继续 执行");
try {
Thread.sleep(2000);
System.out.println("当前线程完成了第二次2秒休眠");
} catch (InterruptedException e) {
System.out.println("thread线程 第二次休眠 被终止");
}
System.out.println("thread线程执行完毕");
}
});
thread.start();
// 判断thread是否被标记为“终止阻塞”状态
System.out.println("thread线程是否被标记‘终止阻塞’?:"+thread.isInterrupted());
// 将thread线程标记为“终止阻塞”状态,标记之后如果线程中调用wait()、join()、sleep()方法使线程阻塞,则线程阻塞被终止。
thread.interrupt();
// 判断thread是否被标记为“终止阻塞”状态
System.out.println("thread线程是否被标记‘终止阻塞’?:"+thread.isInterrupted());
}
运行结果:
thread线程是否被标记‘终止阻塞’?:false
thread线程 开始 执行
thread线程是否被标记‘终止阻塞’?:true
thread线程 第一次休眠 被终止
thread线程 继续 执行
当前线程完成了第二次2秒休眠
thread线程执行完毕
可以看到:interrupt()将线程标记为终止阻塞状态后,线程中的sleep()被终止,线程继续执行,而第二次sleep()没有被终止,如果希望第二次sleep()也被终止的话,需要再次调用interrupt()方法。
Demo2:
使用interrupt()方法将新开辟线程标记为终止阻塞状态,并使用isInterrupted()方法判断线程的标记状态。
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 2、使用while循环测试interrupt()
System.out.println("thread线程 开始 执行");
while (true) {
for (int i = 0; i < 2100000000; i++) {
if (i == 0) {
System.out.println("thread线程正在运行");
}
}
}
}
});
thread.start();
// 判断thread是否被标记为“终止阻塞”状态
System.out.println("thread线程是否被标记‘终止阻塞’?:"+thread.isInterrupted());
// 将thread线程标记为“终止阻塞”状态,标记之后如果线程中调用wait()、join()、sleep()方法使线程阻塞,则线程阻塞被终止。
thread.interrupt();
// 判断thread是否被标记为“终止阻塞”状态
System.out.println("thread线程是否被标记‘终止阻塞’?:"+thread.isInterrupted());
for (int i = 1; i <= 2100000000; i++) {
if (i == 2100000000) {
System.out.println("当前线程完成了一次伟大的循环");
}
}
// 判断thread是否被标记为“终止阻塞”状态
System.out.println("thread线程是否被标记‘终止阻塞’?:"+thread.isInterrupted());
}
运行结果:
thread线程是否被标记‘终止阻塞’?:false
thread线程 开始 执行
thread线程正在运行
thread线程是否被标记‘终止阻塞’?:true
当前线程完成了一次伟大的循环
thread线程是否被标记‘终止阻塞’?:true
thread线程正在运行
thread线程正在运行
可以看到:线程被interrupt()方法标记为阻塞状态后,由于线程中没有调用wait()、join()、sleep()方法,线程会继续执行。
Demo3:
使用interrupt()方法将当前线程标记为终止阻塞状态,并使用interrupted()方法判断线程的标记状态。
public static void main(String[] args) {
// 判断当前线程是否被标记为“终止阻塞”状态
System.out.println("当前线程是否被标记‘终止阻塞’?:"+Thread.interrupted());
// 将当前线程标记为“终止阻塞”状态
Thread.currentThread().interrupt();
// 判断当前线程是否被标记为“终止阻塞”状态
System.out.println("当前线程是否被标记‘终止阻塞’?:"+Thread.interrupted());
// 判断当前线程是否被标记为“终止阻塞”状态
System.out.println("当前线程是否被标记‘终止阻塞’?:"+Thread.interrupted());
try {
Thread.sleep(2000);
System.out.println("当前线程完成了2秒休眠");
} catch (InterruptedException e) {
System.out.println("当前线程阻塞被终止");
}
}
运行结果:
当前线程是否被标记‘终止阻塞’?:false
当前线程是否被标记‘终止阻塞’?:true
当前线程是否被标记‘终止阻塞’?:false
当前线程完成了2秒休眠
可以看到:当前线程被interrupt()方法标记为终止阻塞状态后,Thread.interrupted()判断结果为true,再次调用Thread.interrupted()方法判断结果为false,因为Thread.interrupted()会取消线程的终止阻塞标记,后边的sleep()方法并没有被终止。
Demo4:
使用interrupt()方法将当前线程标记为终止阻塞状态,线程中调用sleep()方法,并捕获异常,查看运行结果。
public static void main(String[] args) {
// 将当前线程标记为“终止阻塞”状态
Thread.currentThread().interrupt();
try {
Thread.sleep(2000);
System.out.println("当前线程完成了2秒休眠");
} catch (InterruptedException e) {
System.out.println("当前线程阻塞被终止");
}
}
运行结果:
当前线程阻塞被终止
可以看到:当前线程被interrupt()方法标记为终止阻塞状态后,后边的sleep()方法被终止。
Demo5:
使用interrupt()方法将当前线程标记为终止阻塞状态,线程中调用sleep()方法,但不捕获异常,查看运行结果。
public static void main(String[] args) throws InterruptedException {
// 将当前线程标记为“终止阻塞”状态
Thread.currentThread().interrupt();
Thread.sleep(2000);
System.out.println("当前线程继续运行");
}
运行结果:
由于没有捕获异常,线程的sleep()方法被终止后,将抛出InterruptedException,线程不再继续运行。