我在理解睡眠是如何工作方面遇到了问题。例如在Java中,如果我有一个Thread并写:
try{
Thread.sleep(1000);
}
catch(exception e){//something}
finally{ someFunction();}
据我所知,在这段代码中,threadf会休眠一秒钟,然后执行someFunction。但为什么这不起作用:
try{
Thread.sleep(1000);
someFunction();
}
catch(exception e){//something}
当然在这段代码中,处理器为一个seocnd“休眠”,然后执行someFunction()。但这不是它的工作原理。我想知道为什么?
答案 0 :(得分:3)
两个语句的功能完全相同,只要不抛出异常 - 两者之间的唯一区别是,如果在try块中抛出异常,将执行finally
块
答案 1 :(得分:1)
引用javadoc:
抛出InterruptedException - 如果另一个线程中断了当前线程。
当你的线程没有被中断时,两个代码块是等价的,但是你不知道你是否会被打断,所以为了确保你的代码在两种情况下都是正确的,你应该处理InterruptedException
(要么忽略或再次睡觉没有足够的时间过去。)
答案 2 :(得分:0)
来自finally块上的Java tutorial:
当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。
注意:如果在执行try或catch代码时JVM退出,则finally块可能无法执行。同样,如果执行try或catch代码的线程被中断或终止,即使整个应用程序仍在继续,finally块也可能无法执行。
因此,理想情况下,两个代码块的行为之间应该没有区别。但如果你能分享更多有关不同内容的细节,那将会有所帮助。
答案 3 :(得分:0)
在您的第一个代码示例中,即使someFunction()
块引发try
,也会始终执行exception
。在这种情况下,首先执行exception
块,然后执行finally
块。如果没有引发exception
,那么finally
块将在执行try
块后执行。
在第二个代码示例中,如果someFunction()
方法失败,则不会执行sleep()
。然后执行exception
块,并跳过sleep()
方法之后的代码行。