Thread.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 \”。     

解决方法

因为您是直接调用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);
      }
    });
  }
};
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...