Java 什么';这是减慢循环速度的简单方法吗?

Java 什么';这是减慢循环速度的简单方法吗?,java,Java,我有一个应用程序,它将调用函数autoIncrement(),我在其中有一个脚本,如下所示: public static void autoIncrement() { while(true) { varible++; // Wait 1,000 milliseconds. } } 我环顾了很多地方,尝试了Thread.sleep(1000),等待(1000),以及一系列自定义定义,但每当我运行autoIncrement()函数,我制作的GUI崩溃

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

public static void autoIncrement() {
    while(true) {
        varible++;
        // Wait 1,000 milliseconds.
    }
}
我环顾了很多地方,尝试了
Thread.sleep(1000)
等待(1000),以及一系列自定义定义,但每当我运行
autoIncrement()函数,我制作的GUI崩溃,无论我使用什么

有人知道为什么会发生这种情况吗?有没有脚本可以帮助我在代码中[wait 1秒]?

Thread.sleep(1000)是等待1秒的正确方式

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

在EDT中不可能等待1秒,因此,在此处不可能等待1秒。一点也不

但您可以做的是,启动另一个线程并让它等待一秒钟,然后注入一个作业,例如,如果需要,将变量增量返回到EDT,或者自己执行(请注意,从EDT外部,您不能/不应该干扰任何GUI元素)

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

Thread.sleep(1000)是等待1秒的正确方式

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

在EDT中不可能等待1秒,因此,在此处不可能等待1秒。一点也不

但您可以做的是,启动另一个线程并让它等待一秒钟,然后注入一个作业,例如,如果需要,将变量增量返回到EDT,或者自己执行(请注意,从EDT外部,您不能/不应该干扰任何GUI元素)


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

崩溃的堆栈跟踪是什么?您是否尝试过同步方法?如果您在主线程上运行等待/睡眠,UI每次都会暂时冻结(UI线程处理实际界面,如果暂停,UI将暂停)。假设UI冻结是您的问题,那么引入多线程将解决该问题。但是,暂停线程的用例是什么?真的需要吗?根据答案中的建议,注意
Thread.sleep(1000)睡眠本身可能会被中断,因此“睡眠1000毫秒”实际上可能只睡1毫秒。为了保证睡眠时间,您必须捕捉到
中断异常
,如果您想要的睡眠时间还没有过去,则再次睡眠(时间更短)。还有,但它也抛出InterruptedException。@drum-它不输出任何东西,只是冻结,Windows仍然将其视为一个响应程序。但是窗口上的关闭按钮不起作用,GUI完全没有响应。崩溃的stacktrace是什么?您尝试过同步方法吗?如果在主线程上运行等待/睡眠,UI每次都会暂时冻结(UI线程处理实际界面,如果暂停,UI将暂停)。假设UI冻结是您的问题,那么引入多线程将解决该问题。但是,暂停线程的用例是什么?真的需要吗?根据答案中的建议,注意
Thread.sleep(1000)睡眠本身可能会被中断,因此“睡眠1000毫秒”实际上可能只睡1毫秒。为了保证睡眠时间,您必须捕捉到
中断异常
,如果您想要的睡眠时间还没有过去,则再次睡眠(时间更短)。还有,但它也抛出InterruptedException。@drum-它不输出任何东西,只是冻结,Windows仍然将其视为一个响应程序。但是窗口上的关闭按钮不起作用,GUI完全没有响应。嗯,听起来它可以工作,我对Java非常陌生,所以我还需要做些什么来让它工作吗?不,我描述的是方法-因此我解释了为什么。嗯,听起来它可以工作,我对Java非常陌生,所以我还需要做些什么来让它工作呢?不,我所描述的就是方法——因此我解释了为什么。