微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Thread.sleep暂停整个程序

如何解决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);
      }
    });
  }
};
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。