【java】Java线程之interrupt()函数的正确打开方式

java源码中interrupt函数的定义:

public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();

        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }

对java中断的真确定位和使用

在java中的中断interrupt,仅仅只是一种标志状态,即其仅用逻辑值表示,true 和 false ,在默认情况下是false意思是非中断状态,java源码希望利用此中断状态可以让程序员自己控制线程的执行,即中断状态不会影响线程的执行,线程该干嘛还是干嘛。可以理解为java的中断控制不了cpu,它仅有名词含义。
若是我们调用线程的中断方法,当程序即将进入或是已经进入阻塞调用的时候,那么这个中断信号应该由InterruptedException捕获并进行重置,但此也是源码设计好的,跟真正停止程序的运行没有一丁点关系,然而我们仅仅在有必要的时候处理此InterruptedException所对应的操作;当run()方法程序段中不会出现阻塞操作的时候,这时候中断并不会抛出异常,我们需要通过interrupted()方法进行中断检查和中断标志的重置。另外,知道IO操作和synchronized上的阻塞不可中断也是必要的。

下面通过代码和注释解释说明

package com.myThread;

public class TextForInterrupt extends Thread {
    public static void main(String[] args){
        TextForInterrupt textForInterrupt = new TextForInterrupt();
        textForInterrupt.start(); //启动线程,进入Runable
        //textForInterrupt.interrupt();
    }
//我们只需把注意里集中到run()函数上
    public void run(){
        for (int i = 0; i <= 9; ++i) {
            try {
                sleep(2000); //先延迟2秒,此延迟通过线程阻塞实现,即最少再次执行此线程需要2秒之后
                interrupt();  //设置中断异常为true,则在此状态下下次执行sleep()函数时,会抛出中断异常

            } catch (InterruptedException e) {
                //抛出中断异常之后,其结果之一便是中断标志重置为false,在此try结构中,出现此异常的唯一可能是
                //线程的中断状态为true,而执行了造成线程阻塞的语句
                //下面可以自定义更多语句
                System.out.println("出现中断异常");
            }
            System.out.println(Thread.currentThread().isInterrupted()); //输出此时的中断状态
            System.out.println(i);	//显示第几次循环
                /*
                * 当一个线程被设为中断标志为true时,再调用sleep()让其处于阻塞等待队列时,会产生一个中断异常。
                * 获取中断异常的结果之一就是让中断标志回归false,其他目的有程序员自定义。
                * 并且不会改变阻塞的状态。
                * */
            }
        }
    }	
}

程序运行结果为:并对其解释说明

D:\Java\jdk-10.0.1\bin\java.exe "-javaagent:D:\IntelliJ IDEA Community Edition 2018.1.3\lib\idea_rt.jar=64316:D:\IntelliJ IDEA Community Edition 2018.1.3\bin" -Dfile.encoding=UTF-8 -classpath E:\javaproject\chapter08\out\production\chapter08 com.myThread.TextForInterrupt
true  //等待2秒输出前面两行的同时有再输出两行,此行的结果为true是由于次语句 interrupt();
0
出现中断异常  //之所以此行紧跟着上面一行无延迟输出是因为,在中断状态为true的情况下,执行sleep(2000),
			//会抛出InterruptedException异常,由于被catch捕获,所以直接跳到catch语句块,不执
			//sleep(2000)该有的延迟,并 中断标志被重置为false,所以输出下面一行的结果
false	
1
true  //上面输出完后继续等待两秒,由此开始和上面的输出结果及原因一样
2
出现中断异常
false
3
true
4
出现中断异常
false
5
true
6
出现中断异常
false
7
true
8
出现中断异常
false
9

Process finished with exit code 0


注意下面三个函数的用法: Interrupt() :此函数运行的唯一结果是将中断标志设置为true。
interrupted() : 此函数首先返回当前的中断标志状态,即返回 true 或者 false ,然后再将中断状态重置为 false ,
isInterrupted() : 此函数返回当前中断状态,即返回 true 或者 false。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值