【问题标题】:Thread freezes UI while doing Countdown线程在执行倒计时时冻结 UI
【发布时间】:2016-11-07 18:32:37
【问题描述】:

我想使用线程创建一个倒数计时器(这是我被告知要尝试的)。我确实制作了 UI,但是一旦我添加了线程,它就会冻结。我试过使用Thread.yield(),但没有用。我尝试做我在另一个问题中看到的invokeLater() 技巧,但它一直让我不能convert void to Thread

每经过一秒后,UI 应该更新 JTextField。

field = new JTextArea();    
Button = new JButton();
Button.addActionListener
(
    new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            for (int i = Integer.parseInt(field.getText()); i >= 0; i--)
            {
                try
                {
                    Thread.sleep(1000);
                }
                field.setText(Integer.toString(i));
            }
        }
    }
);

【问题讨论】:

  • 你不能在 UI 线程上休眠。
  • 请详细说明我对使用线程 D 有点新鲜:
  • 你的 Thread.sleep(1000);正在阻塞实现小部件的线程......

标签: java multithreading oop timer


【解决方案1】:

您根本没有使用线程。试试这个:

   field = new JTextArea();    
   Button = new JButton();
        Button.addActionListener
        (
            new ActionListener()
            {
                public void actionPerformed(ActionEvent ae)
                {
                    new Thread() {public void run() {
                       for (int i = Integer.parseInt(field.getText()); i >= 0; i--)
                       {
                           try
                           {
                               Thread.sleep(1000);
                           }
                           field.setText(Integer.toString(i));
                       }
                    }}.start();
                }
            }
        );

【讨论】:

  • 天哪,你是救命稻草!太感谢了!!我已经在这几个小时了,我就是放不下这个。我很抱歉这个愚蠢的错误D:
【解决方案2】:

“Swing 事件处理代码运行在一个称为事件调度线程的特殊线程上。大多数调用 Swing 方法的代码也运行在这个线程上。这是必要的,因为大多数 Swing 对象方法都不是“线程安全的”:从多个线程调用它们有线程干扰或内存一致性错误的风险。一些 Swing 组件方法在 API 规范中被标记为“线程安全”;这些可以从任何线程安全调用。所有其他 Swing 组件方法必须从事件调度线程调用. 忽略此规则的程序可能大部分时间都能正常运行,但会出现难以重现的不可预测的错误。”——来自https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

事件调度线程是swing的基础。使用工作线程。

【讨论】:

    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多