本文主要是介绍【面经】interrupt()、interrupted()和isInterrupted()的区别与使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
📝个人主页:五敷有你
🔥系列专栏:面经
⛺️稳中求进,晒太阳
interrupt方法
如果打断线程正在sleep,wait,join会导致被打断的线程抛出InterruptedException,并清除打断标记。如果打断正在运行的线程,则会设置打断标记。park的线程被打断也会被设置打断标记
Interrupted方法
Thread类的静态方法。检测当前线程的中断标记,返回一个boolean并清除中断状态,其连续两次调用的返回结果不一样,因为第二次调用的时候,线程的中断状态已经被清除了,会返回一个false.
isInterrupted()方法
测试线程是否被打断,不会清除中断状态。
演示代码
场景:在sleep时打断
package jvm;import lombok.extern.slf4j.Slf4j;import java.util.logging.Logger;public class TestInterrupt {public static void main(String[] args) throws InterruptedException {MyThread t1=new MyThread();t1.start();Thread.sleep(10000);t1.interrupt();}}
class MyThread extends Thread{@Overridepublic void run() {while (!this.isInterrupted()){try {System.out.println("执行1s");Thread.sleep(1000);} catch (InterruptedException e) {System.out.println("在睡觉的时候被打断了");throw new RuntimeException(e);}}}
}
如上:导致被打断的线程抛出InterruptedException,并清除打断标记。
场景:在正常运行时,打断标记的情况
package jvm;import lombok.extern.slf4j.Slf4j;import java.util.logging.Logger;public class TestInterrupt {public static void main(String[] args) throws InterruptedException {MyThread t1=new MyThread();t1.start();Thread.sleep(10000);t1.interrupt();}}
class MyThread extends Thread {@Overridepublic void run() {while (!this.isInterrupted()) {System.out.println("执行1s");System.out.println("标记" + this.isInterrupted());}}
}
如上:正常运行时被打断是不会被清除标记的。
场景:使用park暂停的线程 打断标记情况
package jvm;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.LockSupport;
import java.util.logging.Logger;public class TestInterrupt {public static void main(String[] args) throws InterruptedException {MyThread t1=new MyThread();t1.start();Thread.sleep(10000);t1.interrupt();}}
class MyThread extends Thread {@Overridepublic void run() {while (!this.isInterrupted()) {LockSupport.park();System.out.println("标记" + this.isInterrupted());}}
}
如上:park被暂停的线程被打断是不会清除标记的。
场景:测试Thread.interrupted静态方法
package jvm;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.locks.LockSupport;
import java.util.logging.Logger;public class TestInterrupt {public static void main(String[] args) throws InterruptedException {MyThread t1=new MyThread();t1.start();Thread.sleep(10000);t1.interrupt();}}
class MyThread extends Thread {@Overridepublic void run() {while (true){boolean interrupted = Thread.interrupted();System.out.println("标记:"+interrupted);if(interrupted){break;}}}
}
这篇关于【面经】interrupt()、interrupted()和isInterrupted()的区别与使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!