Почему мне нужно обрабатывать исключение для Thread.sleep()?
Чтобы получить этот код для компиляции, я могу либо:
Почему я должен это делать?
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()
нужно выбросить это исключение?
Ответы
Ответ 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