Java Thread.sleep暂停整个程序
我有一个带有按钮的主窗体,当按下按钮时,应该会启动一个新的倒计时线程 这是按钮的操作侦听器中的代码:Java Thread.sleep暂停整个程序,java,multithreading,sleep,Java,Multithreading,Sleep,我有一个带有按钮的主窗体,当按下按钮时,应该会启动一个新的倒计时线程 这是按钮的操作侦听器中的代码: Counter c = new Counter(timeToFinish); 这是计数器类的代码: class Counter implements Runnable { int waitingTime = 0; Thread myCounter = new Thread(this); public Counter(int waitingT
Counter c = new Counter(timeToFinish);
这是计数器类的代码:
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);
}
}
问题是,当我创建计数器类的新实例时,它会暂停整个程序,而不仅仅是该线程!问题一定出在“Thread.sleep”上。因为您正在直接调用run方法 相反,您应该将其包装在线程中并启动线程 例如,更换
myCounter.run();
借
你应该使用SwingUtilities类 看
实际上,您并不是在
start()
ing多个线程
Thread.run()
方法只运行与线程相关联的代码,就像任何其他普通函数一样。它不会启动单独的线程
您需要调用
Thread.start()
,以启动新线程并在其中运行代码。仅仅因为您从计数器构造函数调用run
方法。这不是线程的工作方式。您必须删除此调用,将Runnable
包装在线程
实例中,并在线程上调用start()
:
new Thread(new Counter(2)).start();
您应该使用线程的start()
方法。使用
c.start();
否则,您就有一个类,并且您正在调用它的一个方法,当然,它正在主线程中运行,并在主线程中休眠 您直接调用run,它将在当前线程中运行,并休眠当前线程,我猜这就是事件线程。这会导致程序暂停。甚至没有提到Swing。他提到了一个带有按钮的表单,这可能表明这是一个GUI程序。为什么程序会暂停?是因为当前线程是UI线程吗?正常情况下,主线程应该为每个计数器暂停1秒,对吗?
new Thread(new Counter(2)).start();
c.start();