Подтвердить что ты не робот

Почему мне нужно обрабатывать исключение для Thread.sleep()?

Чтобы получить этот код для компиляции, я могу либо:

  • Поместите мой вызов Thread.sleep() в блок try/catch или
  • Объявите printAll(), что он может вызывать InterruptedException.

Почему я должен это делать?

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 SCJP book.)

Я знаю, что исключение, которое Thread.sleep() throws является проверенным исключением, поэтому мне нужно его обработать, но в какой ситуации Thread.sleep() нужно выбросить это исключение?

4b9b3361

Ответ 1

Если метод объявлен таким образом, что он может выдавать проверенные исключения (Exception, которые не являются подклассами RuntimeException), вызывающий его код должен вызывать его в блоке try-catch или метод вызывающего абонента должен объявите его бросить.

Thread.sleep() объявляется следующим образом:

public static void sleep(long millis) throws InterruptedException;

Он может бросить InterruptedException, который прямо расширяет java.lang.Exception, поэтому вам нужно поймать его или объявите его бросить.

И почему объявлен Thread.sleep() таким образом? Поскольку если Thread спал, поток может быть прерван, например. с Thread.interrupt() другим потоком, в этом случае спящий поток (метод 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 run() method will throw an InterruptedException!

Вывод:

Sleeping...
I was interrupted!
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at Main$1.run(Main.java:13)

Ответ 2

Один Thread может взаимодействовать с другим Thread и взаимодействовать с другим Thread, и один из способов, которым он может это сделать, - это прервать его: если t - это еще один Thread, вы можете вызвать t.interrupt(), чтобы спросить его вежливо остановить то, что он сейчас делает. Это, в частности, то, что вы, возможно, захотите сделать, если t будет спать: вы можете его разбудить. То, что он делает, это вызвать метод InterruptedException в t Thread.sleep(), чтобы он мог его поймать и ответить. Из-за этого каждый раз, когда вы используете Thread.sleep(), чтобы текущий поток спал, вам нужно иметь дело с возможностью InterruptedException, если другой поток решает разбудить его.

В вашем случае у вас есть только один Thread, поэтому вы знаете, что не может быть InterruptedException из другого места в вашем коде. Но это не редкость, что нужно делать в многопоточном коде.

Ответ 3

 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();
            }}

Предположим, что у нас есть два потока t и t2, а t выполняется при выполнении, t2 пришел, и t2 также начинает выполняться, но t еще не закончен       там поток прерывается, и вы теряете свои данные. В приведенном выше примере поток t работает и когда в режиме spleeping, и там t2 пришел       и начать выполнение внезапно t встать, но t2 работает, это шанс прерванного возникновения и потери данных, чтобы избежать этого, мы используем interruptedexception