2015-02-06 87 views
0

嗨,我正在做一個相當簡單的「卡拉OK」程序... 我試圖用java來改變顯示的文本線程以鼠標點擊開始。當沒有循環,我重複點擊鼠標它的作品,但當我將無限while循環添加到thread.run()它變得卡住......它什麼也沒做......我做錯了什麼? 這裏是我的代碼:Java線程循環Stucks程序

public class Timer extends Thread { 
MainWindow window; 
public int timeSec; 
ArrayList<Integer> times; 
public Song song; 

public Timer(MainWindow window){ 
    times = new ArrayList<Integer>(); 
    times.add(10);  // de alto 
    times.add(50);  // el carino 
    times.add(70);  // cuando juanita 
    times.add(92);  // Limpia el 
    times.add(113);  // de alto 
    times.add(160);  // sabes 
    times.add(215);  // la cosa esta + o.J 
    times.add(226);  // mira 
    times.add(244);  // ref 
    times.add(266);  // matus 
    times.add(272);  // Janka + krik 
    times.add(293);  // mira 

    song = new Song(); 
    this.window = window; 
    timeSec = 0; 
    //run(); 
} 

public void start(){ 
    run(); 
} 

public void run(){ 
    while (true){ 
     try { 
      sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     timeSec++; 
     if (times.contains(timeSec)){ 
      song.next(); 
     } 
     window.repaint(); 

    } 
} 
} 
+2

while(true)keep running?你不說? – Stultuske 2015-02-06 13:48:22

+0

在你的run方法中,while(true){} – safaiyeh 2015-02-06 13:50:46

+0

的目的不是它繼續運行......它應該調用song.next()並重新繪製JPanel ...並且我需要它永久地運行。 .. – joasisk 2015-02-06 13:55:29

回答

6

你已經覆蓋了Thread的start()方法。所以一旦你調用start(),沒有實際的線程產生。見how to override thread.start() method in java?

+0

加一,故事的寓意是不要分類'線程',除非你無法避免它。這隻會導致混亂。 – 2015-02-06 13:51:36

+0

tahank你...它已經有一段時間,因爲我使用線程,所以我不記得 – joasisk 2015-02-06 13:57:05

0

尼古拉·伊萬諾夫已經發布了答案,我會嘗試添加一些背景:

Thread類實際上創建了一個新的本地線程從start() - 方法調用的所有代碼。你自己實現的start()隱藏了Thread中的那個,並且不通過super()來調用它 - 所以它基本上就像你可能實現的任何其他方法一樣,並且不執行任何線程創建。因此,您的無限循環在主線程(或擺動的EDT)上運行,從而凍結您的應用程序。

所以最好的方法是不要在Thread-class內搞亂。取而代之的是創建一個Runnable,將它傳遞給Thread -constructor和start()這個線程方式做事錯誤的可能性較小。