为什么我需要处理Thread.sleep()的异常?

时间:2014-11-02 19:21:32

标签: java multithreading exception

要编译此代码,我可以:

为什么我必须这样做?

class Test {
    public static void main( String[] args ) {
          printAll( args );
    }

    public static void printAll( String[] line ) {
        System.out.println( lines[ i ] );
        Thread.currentThread().sleep( 1000 ):
    }
}

(来自Kathy Sierra's SCJP book的示例代码。)

我知道Thread.sleep()抛出的异常是一个经过检查的异常,所以我必须处理它,但Thread.sleep()在什么情况下需要抛出此异常?

3 个答案:

答案 0 :(得分:30)

如果方法声明的方式可以抛出已检查的异常(Exception不是RuntimeException的子类),则调用它的代码必须在{{1}中调用它阻止或调用者方法必须声明抛出它。

Thread.sleep()声明如下:

try-catch

它可能会抛出InterruptedException直接扩展java.lang.Exception所以你必须抓住它或声明扔掉它。

为什么public static void sleep(long millis) throws InterruptedException; 以这种方式宣布?因为如果Thread正在休眠,则线程可能会被中断,例如另一个线程使用Thread.interrupt(),在这种情况下,休眠线程(Thread.sleep()方法)将抛出此sleep()的实例。

示例:

InterruptedException

<强>输出:

Thread t = new Thread() {
    @Override
    public void run() {
        try {
            System.out.println("Sleeping...");
            Thread.sleep(10000);
            System.out.println("Done sleeping, no interrupt.");
        } catch (InterruptedException e) {
            System.out.println("I was interrupted!");
            e.printStackTrace();
        }
    }
};
t.start();     // Start another thread: t
t.interrupt(); // Main thread interrupts t, so the Thread.sleep() call
               // inside t's run() method will throw an InterruptedException!

答案 1 :(得分:5)

一个Thread可以与另一个Thread进行通信并与之互动,并且可以通过中断它来实现此目的:如果t是另一个Thread,则可以致电t.interrupt()礼貌地要求它停止目前正在做的事情。如果t正在睡觉,这可能是您可能想要做的事情:您可能想要将其唤醒。它的作用是在InterruptedException的{​​{1}}方法中生成t,以便它可以捕获并响应。因此,只要您使用Thread.sleep()使当前线程进入休眠状态,就必须处理Thread.sleep()的可能性,以防另一个线程决定将其唤醒。

在您的情况下,您只有一个InterruptedException,因此您知道代码中的其他位置不能是Thread。但是在多线程代码中想要做的事情并不罕见。

答案 2 :(得分:-2)

 class Demo extends Thread{
    public void run() {
        for (int i = 0; i <10; i++) {
        system.out.println("hello Ziyad");
        thread.sleep(1000);
    }} }
            public class Threddemo{
        public static void main(string[] args) throws interruptedexception {
            Demo t=new Demo();
            Demo t2=new Demo();
        t.start();
        t2.start();
            }}

假设我们有两个Thread t和t2并且t正在执行时执行,t2来了,t2也开始执行但是t还没有完成         线程被中断,你丢失了你的数据。在上面的例子中,线程正在运行,当处于浏览模式时,有t2来了         并开始执行突然t起来但是t2正在运行这是中断值和数据丢失的可能性以避免这种情况我们使用interrupttedexception