我有一个带有按钮的主窗体,按下时,应该启动一个新的倒计时器线程。
这是按钮动作监听器中的代码:
Counter c = new Counter(timeToFinish);
这是Counter类的代码:
class Counter implements Runnable {
int waitingTime = 0;
Thread myCounter = new Thread(this);
public Counter(int waitingTime)
{
this.waitingTime = waitingTime;
myCounter.run();
}
public void run(){
//Start countdown:
do
{
waitingTime -= 1;
try {
Thread.sleep(1000);
System.out.println(waitingTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (waitingTime >= 0);
}
}
问题是,当我创建Counter类的新实例时,它会暂停整个程序,而不仅仅是那个线程!问题必须是“Thread.sleep”。
答案 0 :(得分:6)
因为您直接调用运行方法。
相反,你应该将它包装在一个线程中并启动线程。
例如,替换
myCounter.run();
通过
new Thread(this).start();
答案 1 :(得分:3)
只是因为您从run
构造函数调用Counter
方法。这不是它如何与线程一起工作。您必须删除此调用,将Runnable
包装在Thread
实例中并在线程上调用start()
:
new Thread(new Counter(2)).start();
答案 2 :(得分:1)
您实际上并非start()
多个线程。
Thread.run()
方法只需运行与线程关联的代码,就像任何其他正常函数一样。它不会启动单独的线程。
您需要致电Thread.start()
,开始一个新线程并在其中运行您的代码。
答案 3 :(得分:0)
您应该使用线程的start()
方法。使用
c.start();
否则你有一个类,你正在调用它的一个方法,当然它在主线程中运行并且正在休眠主线程。
答案 4 :(得分:0)
你正在直接调用run,它将在当前线程中运行,并且睡眠当前线程,我猜这是事件线程。这会导致程序暂停。
答案 5 :(得分:-1)
您应该使用SwingUtilities类
见
http://www.java2s.com/Code/Java/Threads/InvokeExampleSwingandthread.htm
// Report the result using invokeLater().
SwingUtilities.invokeLater(new Runnable() {
public void run() {
resultLabel.setText("Ready");
setEnabled(true);
}
});
}
};