Java: mytextarea.setText ("hello") + Thread.sleep(1000) = 奇怪的结果

标签 java user-interface multithreading

我有这样的东西:

for(int i=0; i<5; i++){
    mytextarea.setText("hello " + i);
    try{
        Thread.currentThread().sleep(1000); //to give time for users to read
    } catch(Exception e){}
}

我期望它会在文本区域显示“hello 0”,等待1秒,然后显示“hello 1”,然后等待1秒,等等。

但是发生的情况不同,它等待 5 秒,然后显示“hello 4”。

有什么想法吗?

最佳答案

是的 - 你基本上阻塞了 UI 线程,所以它永远不会真正更新。

在 UI 线程中 hibernate 是一个非常糟糕的主意。

如果你想做这样的事情,你应该使用Timer 。 (我假设您正在使用 Swing。如果没有,请编辑您的问题以表明您正在使用哪个 UI 框架。)

您还应该注意,Thread.sleep 是一个静态方法。您使用它就像它是一个实例方法一样。诚然,您碰巧在当前线程“上”调用它,但您的用法表明您认为:

Thread t = new Thread(...);
t.start();
t.sleep(1000);

将使线程 hibernate 。它不会 - 它会让当前线程 hibernate ,因为这就是 Thread.sleep 总是做的事情。在我看来,Java 允许您以这种方式调用静态方法是一个错误 - 如果您使用的是 Eclipse,则可以选择将其设置为警告或错误。

关于Java: mytextarea.setText ("hello") + Thread.sleep(1000) = 奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2034321/

相关文章:

java - Prettyfaces:在观察特定的 url 模式时将 bean 属性设置为某个常量值

c++ - 在 QT QTextEdit 中粘贴表情符号

c++ - 如何通过 HANDLE 判断一个堆是否被序列化?

java - JComboBox 不显示结果

c - 是否有任何以 C DLL 形式存在的 GUI 工具包?

java - 使用线程池创建一个等待来自客户端的消息的java服务器套接字

c++ - 线程权限

java - Java中的ArrayList方法toArray有@SuppressWarnings ("unchecked")注释

java - Android运行时: FATAL EXCEPTION

JavaFX Scene Builder 2.0 动态 css 菜单按钮