问题描述
|
我有一个带有按钮的主窗体,当按下该窗体时,应该启动一个新的倒数计时器线程。
这是按钮的动作侦听器中的代码:
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 \”。
解决方法
因为您是直接调用run方法。
相反,您应该将其包装在Thread中并启动该线程。
例如,更换
myCounter.run();
通过
new Thread(this).start();
,只是因为您从Counter
构造函数调用了run
方法。那不是它与线程一起工作的方式。您必须删除此调用,将Runnable
包装在Thread
实例中,然后在线程上调用start()
:
new Thread(new Counter(2)).start();
,您实际上并没有多线程(8)。
像其他任何普通函数一样,Thread.run()
方法仅运行与线程关联的代码。它不会启动单独的线程。
您需要调用ѭ12来启动一个新线程并在其中运行代码。
,您应该使用线程的“ 8”方法。采用
c.start();
否则,您将拥有一个类,并且正在调用其方法之一,并且该类当然在主线程中运行并且使主线程处于休眠状态。
,您直接调用run,它将在当前线程中运行,并休眠当前线程,我猜这是事件线程。这会导致程序中的暂停。
,您应该使用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);
}
});
}
};