2016-03-21 46 views
3

我试图通过调用Thread类的sleep()方法来暂停执行部分程序几秒钟。但是,当我尝试这样做时,在调用之后立即执行的代码仍然立即执行。例如,如果我有代码:如何在Thread的sleep()方法立即执行后停止代码

Thread compoundThread = new Thread(new Runnable() 
{      
    public void run() 
    { 
     try 
     { 
      Thread.currentThread().sleep(2000); 
     } 
     catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      Thread.currentThread().interrupt(); 
     }    
    } 

}); 

compoundThread.start(); 

System.out.println("line 15") 

第15行只是立即打印。有没有解决这个问题的方法?我认为sleep()方法的全部想法是暂停执行。

编辑回应菲利普的评论

while (totalNoOfPhase1Trials > 399) 
{   // 
       Phase1Trial phase1Trial = new Phase1Trial(numberOfElements, elementColors); 

       displayComplexStimulus(phase1Trial.getComplexStimulus()); 
       validate(); 

       Thread compoundThread = new Thread(new Runnable(){ 

        public void run() { 
         try { 
          Thread.currentThread().sleep(2000); 
          System.out.println("line 226"); 
         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 

         } 


        } 

       }); 



       compoundThread.start();  
       try { 
        compoundThread.join(); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

displayCompoundStimulus方法显示无延迟的时候,我不包括你刚才提到的,我把线程睡眠代码一套jlabels。但是,当我包含使线程进入睡眠状态的代码时,图像的显示也会延迟两秒,这很奇怪,因为在显示图像后执行Thread.sleep()

+0

能否请您包括行号为您的代码 – amith

+0

我不知道怎么样,但的System.out.println(“线15“)是行15. – lb91

+0

线程将在另一个执行上下文中执行;你期望什么? – fge

回答

-2

我建议你用简单的

thread.sleep(2000) 
+0

这也没有效果。刚刚尝试过。 – lb91

+1

@Sandeep:欢迎来到StackOverflow!你可以随时编辑你的答案(使用下面的链接)。特别是发布代码的评论不适合。直接在答案中使用代码块。查看[Markdown帮助](http://stackoverflow.com/editing-help)了解如何正确格式化。 – siegi

1

主线程启动运行你的主要方法之一。

然后,您的主要方法将创建一个新的Thread对象并调用compoundThread.start();,这会导致第二个线程开始执行。

紧接着,不停止主线程继续执行并到达打印语句。因此line 15正在由主线程打印。

你开始睡觉的secnond线程2秒后终止。如果您在打印sleep之后将打印语句放在线程的run方法中,则在打印line 15之前会有2秒的暂停。

+0

感谢您的详细解释。我现在知道了。 – lb91

1

这里compoundThread是一个新的线程对象。您的line 15通过main方法执行。因此,当您启动compoundThread.start()时,会创建一个新线程并独立于主线程启动。

如果您想减慢主线程,只需在可运行目标代码外部使用Thread.sleep(2000)

+0

我发现当我这样做时,它最终会减慢Thread.sleep(2000)之前的代码执行时间两秒。例如,如果我在Thread.sleep(2000)方法之前放置一个打印语句并在之后放置一个打印语句,那么这两个打印语句将同时打印,这对我来说没有意义。 – lb91

+0

@ lb91这就是主意。这取决于你想要“睡觉”的时间和线程。正如其他答案指出的那样,如果你在外面使用它,它会减慢你的主线程,在可运行的内部,那么它会减慢线程的特定实例。 – Ram

3

该代码的行为如实施。你正在运行你的主线程,它启动另一个线程,睡眠2000毫秒。

所以,你的主线程的作用:

  1. 启动compoundThread
  2. 打印出来
  3. 完成主线

取决于你想要达到的目标,你可以只取出整线程和做:

try { 
    Thread.sleep(2000); 
} catch (InterruptedException e) { 
    // should not happen, you don't interrupt      
} 
System.out.println("line 15"); 

否则,您可以输出移动到线程的run方法:

Thread compoundThread = new Thread(new Runnable(){ 

    public void run() { 
     try { 
      Thread.sleep(2000); 
      System.out.println("line 15"); 
     } catch (InterruptedException e) { 
      // do whatever has to be done 
     } 
    } 
}); 

compoundThread.start(); 

// you might want to wait until compoundThread is done 
compoundThread.join(); 

UPDATE:基于关于延迟输出您的评论

如果使用下面的代码:

public static void main(String[] args) { 
    System.out.println("Hello"); 
    try { 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     // should not happen, you don't interrupt 
    } 
    System.out.println("World"); 
} 

输出将是“你好”,在“世界”之后两秒钟。线程将会休眠两秒钟。

+2

...或者你在加入后在主线程中打印... ;-) – siegi

+0

@siegi该死的我错过了那个解决方案:) – Philipp

+0

关于删除整个线程的建议会给我造成问题,因为它会延迟执行在Thread.sleep()行之前的打印语句也是两秒钟,我不知道为什么。 – lb91

0

您的原始线程(主线程)启动一个新线程,并且新线程休眠两秒钟。原来的线程没有,这就是为什么它立即打印“15行”。所以Sandeep的建议尽管很简单,但如果你理解并正确地应用它,它应该可以工作。另一个明显的可能性是将System.out.println陈述放入compoundThreadrun方法中。