要编译此代码,我可以:
Thread.sleep()
或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's SCJP book的示例代码。)
我知道Thread.sleep()
抛出的异常是一个经过检查的异常,所以我必须处理它,但Thread.sleep()
在什么情况下需要抛出此异常?
答案 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