1、InterruptedException异常是什么?

官网的解释是这样的:

Thrown when a thread is waiting, sleeping, or otherwise occupied, and the thread is interrupted, either before or during the activity.

读起来很晦涩,给大家解读一下:当一个线程正在等待、休眠或被占用,并且在活动之前或期间线程被中断时抛出。

  • 等待指的是:调用Object.wait()/Object.wait(long)方法,之后进入等待状态,只等着被唤醒。没有人唤醒则一直死等。
  • 休眠指的是:调用Thread.sleep(long)方法,休息一会儿,到点之后自己醒来干活
  • 被占用指的是锁被占用,从而被迫进行堵塞。不断的监控锁,一旦有机会则上锁开始干活。

总之,以上三种情况都属于让线程放下手头上的活儿,暂停所有活动。一旦它们重启干活儿,则需要向外界发送信号,告知一下,这就是中断。中断属于信号而已,但是在Java里面被归入了异常,所以有了:InterruptedException异常。

2、InterruptedException异常使用场景1

public class Test
{

    public static void main(String[] args)
    {
        Thread.sleep(1000);
        System.out.println("hello world!");
    }

}

如上所述,main线程要先睡上1000毫秒,睡醒之后它要发出中断信号,告诉CPU它醒来了。但是,在Java语言里面没有信号机制,所以JDK的作者只能煞费苦心进行改造,从异常入手进行改造:InterruptedException,改造后的代码就是这样的:

public class Test
{

    public static void main(String[] args) throws InterruptedException
    {
        Thread.sleep(1000);
        System.out.println("hello world!");
    }

}

main线程抛出异常就是要告诉调用main线程的JVM进程,它已经睡醒了,可以继续干活了。JVM进程看到这个异常明白什么意思,不需要做额外处理。

3、InterruptedException异常使用场景2

InterruptedException异常仅仅是信号,可以利用其信号机制,如下所示:

try 
{  
    TimeUnit.SECONDS.sleep(2);  
} 
catch (InterruptedException e) 
{  
    //收到信号之后,可以做些其他的操作 
} 
public class Test
{

    public static void main(String[] args)
    {
        try
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e)
        {
            System.err.println("InterruptedException caught!");
            e.printStackTrace();
        }
        System.out.println("hello world!");
    }

}

main线程自己消化异常,不向外抛出。

标签: none

添加新评论