java - 什么是减慢循环的简单方法?
问题描述
我有一个将调用函数的应用程序autoIncrement();
,其中有一个脚本,如下所示:
public static void autoIncrement() {
while(true) {
varible++;
// Wait 1,000 milliseconds.
}
}
我环顾了一堆并尝试了Thread.sleep(1000);
,wait(1000);
和一堆自定义定义,但是每当我运行该autoIncrement();
函数时,无论我使用什么,我所做的 GUI 都会崩溃。
有谁知道为什么会发生这种情况以及任何可以在我的代码中帮助我 [等待 1 秒] 的脚本?
解决方案
Thread.sleep(1000);
是等待1秒的正确方法。
但是,如果autoIncrement
在所谓的“EDT”(事件调度线程)中调用,那就不好了;您绝不能在 EDT 中阻塞(= 让线程“冻结”,这发生在显式调用 sleep 时,也包括任何访问磁盘或网络资源或数据库的尝试),因为如果您这样做,操作系统会认为您已经崩溃. 每当调用事件处理程序(例如,您注册为单击侦听器的代码)时,您就处于 EDT 中。
在 EDT 中根本不可能等待 1 秒,因此,这里不可能等待 1 秒。完全没有。
但是你可以做的是启动另一个线程并让它等待一秒钟,然后注入一个作业,例如,如果需要的话,将变量增加回 EDT,或者只是自己做(注意从 EDT 外部你不能/不应该与任何 GUI 元素混淆)。
要将代码注入 EDT 以运行,它是SwingUtilities.invokeLater(() -> { code goes here })
. 要启动线程,请查看线程教程,或者使用SwingWorker
.
推荐阅读
- django - 我的新迁移将破坏我在 heroku (postgres) 上的数据库
- r - R spml 和 plm:为什么在空间固定效应中有截距?
- python - 检查两个 defaultdict 的值是否与相同的键匹配
- assembly - x86 RCL/RCR指令的实际应用是什么?
- regex - 如何在正则表达式上使用前瞻
- java - 无论我通过什么字符串,Web Element sendKeys() 都会添加一个额外的字符。怎么修?
- python - 来自响应对象的文本是否不适用于正则表达式?
- azure - 使用 Azure Function V2 Durable 函数时,ILogger 不记录到 Application Insights
- node.js - 有效负载到达工作人员时变得未定义
- excel - 为什么无法通过 VBA 保存使用 Internet Explorer 打开的文件?