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();