【问题标题】:Thread.sleep pausing whole programThread.sleep 暂停整个程序
【发布时间】:2011-05-26 11:30:35
【问题描述】:

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

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

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

【问题讨论】:

  • 程序为什么会暂停?是因为当前线程是 UI 线程吗?通常主线程应该通过为每个计数器暂停 1 秒来运行,对吧?

标签: java multithreading sleep


【解决方案1】:

因为你是直接调用run方法。

相反,您应该将其包装在一个线程中并启动线程。

例如,替换

myCounter.run();

new Thread(this).start();

【讨论】:

    【解决方案2】:

    仅仅因为您从Counter 构造函数调用了run 方法。这不是它与线程一起工作的方式。您必须删除此调用,将 Runnable 包装在 Thread 实例中并在线程上调用 start()

     new Thread(new Counter(2)).start();
    

    【讨论】:

      【解决方案3】:

      你实际上并没有start()ing 多个线程。

      Thread.run() 方法只是运行与线程关联的代码,就像任何其他普通函数一样。它不会启动一个单独的线程。

      您需要调用Thread.start(),以启动一个新线程并在其中运行您的代码。

      【讨论】:

        【解决方案4】:

        您应该使用线程的start() 方法。使用

        c.start();
        

        否则你有一个类并且你正在调用它的一个方法,当然它在主线程中运行并让主线程休眠。

        【讨论】:

          【解决方案5】:

          你直接调用run,它会在当前线程中运行,并且休眠当前线程,我猜是事件线程。这会导致您的程序暂停。

          【讨论】:

            【解决方案6】:

            你应该使用 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);
                  }
                });
              }
            };
            

            【讨论】:

            • Swing 甚至没有被提及。
            • 他提到了一个带有按钮的表单,这可能表明这是一个 GUI 程序。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-11-13
            • 2016-09-21
            • 1970-01-01
            • 1970-01-01
            • 2014-12-11
            • 1970-01-01
            • 2019-09-27
            相关资源
            最近更新 更多