Understand the use of interrupt()

//对 interrupt(); 的理解
//1. IS_INTERRUPTED = true;IS_INTERRUPTED是中断标志位
//2. 如果线程处于调用以下三个方法
//     wait()/join()/sleep()造成阻塞,就直接
//     抛出InterruptedException异常
//3. 抛出异常以后,修改为IS_INTERRUPTED = fasle;
t.interrupt(); //实例调用

代码比较:

public static void main(String[] args) throws InterruptedException {
   Thread t = new Thread(new Runnable() {
       @Override
       public void run() {
           try {
               while (!Thread.currentThread().isInterrupted()){
                   System.out.println(Thread.currentThread().getName());
                   //抛出异常
                   Thread.sleep(1000);//有异常
                   //处于休眠状态也可以中断(抛出异常中断)
               }
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
   });
   t.start();
   Thread.sleep(3000);
   t.interrupt();
}

若没有 Thread.sleep(3000); ,因为 main 线程 比 t 线程 被系统调度的早,所以则直接执行到 t.interrupt(); 时,会修改中断标志位为true,之后系统调度到 t 线程时,经过while循环的判断条件时,判断条件不满足,并不会进入循环,不会打印,就结束了t 进程。

有 Thread.sleep(3000); 时,,休眠三秒,在这三秒里 t 线程已经被系统调度到,t 线程运行时,此时 t线程 的 中断标志位 是 fasle 会进入while循环里,先打印,然后会遇到休眠的语句Thread.sleep(1000);休眠后再继续判断是否满足while循环条件,继续打印 、 休眠、打印、休眠,直到Thread.sleep(3000);语句休眠结束,执行到 t.interrupt(); 行会让 中断标志位 置true,在t 线程中运行到Thread.sleep(1000);时,会抛出 InterruptedException 异常 ,t 线程结束。

//代码2
public static void main(String[] args) throws InterruptedException {
   Thread t = new Thread(new Runnable() {
       @Override
       public void run() {
          while (!Thread.currentThread().isInterrupted()){//while循环放在外面
          		//异常再循环内部处理。
		           try {
		                   System.out.println(Thread.currentThread().getName());
		                   //抛出异常
		                   Thread.sleep(1000);//有异常
		                   //处于休眠状态也可以中断(抛出异常中断)
		           } catch (InterruptedException e) {
		               //抛出异常后,修改为IS_INTERRUPTED = fasle
		               e.printStackTrace();
		           }
		 }
       }
   });
   t.start();
   t.interrupt();
}

以上代码,因为main线程执行到 t.interrupt();把中断标志位置为true,后面执行到 t 线程 时 没有进入到循环 结果是 进程结束。

代码3
public static void main(String[] args) throws InterruptedException {
   Thread t = new Thread(new Runnable() {//匿名内部类传入Runnable
       @Override
       public void run() {
           try {
               while (!Thread.currentThread().isInterrupted()){
                   System.out.println(Thread.currentThread().getName());
                   //抛出异常
                   Thread.sleep(1000);//有异常
                   //处于休眠状态也可以中断(抛出异常中断)
               }
           } catch (InterruptedException e) {
               //抛出异常后,修改为IS_INTERRUPTED = fasle
               e.printStackTrace();
           }

       }
   });
   t.start();
   Thread.sleep(3000);
   t.interrupt();
}

加上Thread.sleep(3000);时 t 线程开始运行一段时间,打印了几次,但是等Thread.sleep(3000);休眠结束,执行到 t.interrupt();时,把中断标志位修改成true ,遇到 t 线程中的 Thread.sleep(1000);休眠时,会抛出异常,抛出异常后,受到t.interrupt();的影响(中断标志位又被置为fasle),但由于抛出异常的操作是在while循环中的,while循环的判断条件仍然满足,进入循环,执行打印、休眠,然后就一直执行打印、休眠的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值