嗨,我正在做一个相当简单的卡拉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();
}
}
}
答案 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()
线程 - 减少错误的可能性。