Java 线程循环卡住了程序

Java thread loop stucks program

您好,我正在做一个相当简单的 "karaoke" 程序... 我正在尝试使用鼠标单击开始的 java 线程更改显示的文本。当没有循环并且我重复单击鼠标时它可以工作但是当我将无限 while 循环添加到 thread.run() 时它会卡住......它什么都不做......我做错了什么? 这是我的代码:

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();

    }
} 
}

您已经覆盖了 Thread 的 start() 方法。所以一旦你调用 start() 就不会产生实际的线程。参见 how to override thread.start() method in java?

Nikolay Ivanov 已经发布了答案,我将尝试添加一些上下文:

Thread class 中,所有实际创建新本机线程的代码都是从 start() 方法调用的。您自己的 start() 实现隐藏了 Thread 中的那个,并且不通过 super() 调用它 - 所以它基本上就像您可能实现的任何其他方法一样,并且不创建任何线程.结果,您的无限循环在主线程(或 EDT in swing)上 运行,从而冻结了您的应用程序。

所以最好的办法就是不要在Thread-class里面乱来。而是创建一个 Runnable,将其传递给 Thread-构造函数和 start() 线程 - 做错事情的可能性较小。