Thread.sleep暂停整个程序

时间:2011-05-26 11:30:36

标签: java multithreading sleep

我有一个带有按钮的主窗体,按下时,应该启动一个新的倒计时器线程。

这是按钮动作监听器中的代码:

 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”。

6 个答案:

答案 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);
      }
    });
  }
};