2016-03-21 400 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方法中。