2015-02-06 41 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()这个线程方式做事错误的可能性较小。