穿线和睡觉

时间:2011-01-02 10:59:19

标签: java multithreading sleep

我在理解睡眠是如何工作方面遇到了问题。例如在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()。但这不是它的工作原理。我想知道为什么?

4 个答案:

答案 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()方法之后的代码行。