首页 > 解决方案 > 什么是减慢循环的简单方法?

问题描述

我有一个将调用函数的应用程序autoIncrement();,其中有一个脚本,如下所示:

public static void autoIncrement() {
    while(true) {
        varible++;
        // Wait 1,000 milliseconds.
    }
}

我环顾了一堆并尝试了Thread.sleep(1000);,wait(1000);和一堆自定义定义,但是每当我运行该autoIncrement();函数时,无论我使用什么,我所做的 GUI 都会崩溃。

有谁知道为什么会发生这种情况以及任何可以在我的代码中帮助我 [等待 1 秒] 的脚本?

标签: java

解决方案


Thread.sleep(1000);是等待1秒的正确方法。

但是,如果autoIncrement在所谓的“EDT”(事件调度线程)中调用,那就不好了;您绝不能在 EDT 中阻塞(= 让线程“冻结”,这发生在显式调用 sleep 时,也包括任何访问磁盘或网络资源或数据库的尝试),因为如果您这样做,操作系统会认为您已经崩溃. 每当调用事件处理程序(例如,您注册为单击侦听器的代码)时,您就处于 EDT 中。

在 EDT 中根本不可能等待 1 秒,因此,这里不可能等待 1 秒。完全没有。

但是你可以做的是启动另一个线程并让它等待一秒钟,然后注入一个作业,例如,如果需要的话,将变量增加回 EDT,或者只是自己做(注意从 EDT 外部你不能/不应该与任何 GUI 元素混淆)。

要将代码注入 EDT 以运行,它是SwingUtilities.invokeLater(() -> { code goes here }). 要启动线程,请查看线程教程,或者使用SwingWorker.


推荐阅读