Java线程循环卡住程序

时间:2015-02-06 13:47:07

标签: java multithreading while-loop

嗨,我正在做一个相当简单的卡拉OK"程序... 我试图用鼠标点击开始的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();

    }
} 
}

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

Nikolay Ivanov已经发布了答案,我将尝试添加一些背景信息:

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

所以最好的方法是不要在Thread - 类内乱。而是创建一个Runnable,将其传递给Thread - 构造函数和start()线程 - 减少错误的可能性。