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()
线程 - 做错事情的可能性较小。
您好,我正在做一个相当简单的 "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()
线程 - 做错事情的可能性较小。