Java:语句未按顺序执行

Posted

技术标签:

【中文标题】Java:语句未按顺序执行【英文标题】:Java: Statements are not executing in order 【发布时间】:2014-03-05 19:39:04 【问题描述】:

我正在执行以下代码:

    lnum.setVisible(false);
    Lsums.setVisible(false);
    Ldigits.setVisible(false);
    Lrows.setVisible(false);
    L1.setVisible(false);
    t1.setVisible(false);
    t2.setVisible(false);
    t3.setVisible(false);
    Button.setVisible(false);
    Done.setText("Done!");
    System.out.println("Done!");
    //setting everything invisible and printing Done on the screen
    try 
        Thread.sleep(5000);
     catch(InterruptedException ex) 
        Thread.currentThread().interrupt();
    
    System.exit(0);

根据我应该发生的情况:完成标签设置为文本“完成!”然后 println 然后等待 5 秒,然后程序关闭。但正在发生的事情是;它确实 println 然后等待 5 秒,但它从未将 done 标签设置为 Done! 为什么?

更新 1 请注意,如果我只是删除睡眠尝试和捕获块,那么它会执行此操作,然后正确显示已完成但如果存在睡眠块则不会

Update 2 为什么不先输出再休眠?为什么? [就像他们说它会挂起的答案一样,好的,我明白了,但是如果我写了它应该设置标签,它应该设置它,然后在设置它之后暂停为什么之前???]

如果仍然不清楚:看看我想要做的是,1. 使某些项目不可见 2. 更改标签的文本 3. 等待 5 秒 4. 自动退出 按照这个确切的顺序。

【问题讨论】:

Done 是什么?向我们展示您的完整代码? 我们能看到 Done 对象吗? 你在哪个线程中执行这段代码?是 EDT 线程吗? 您不能在Event Dispatch Thread 上使用sleep。您的代码将冻结 UI。 我认为你必须重新绘制框架。 【参考方案1】:

您在事件调度线程 (EDT) 中休眠,您冻结了 UI,Swing 无法刷新标签标题。在这种情况下,您只是更改了标签的模型。这意味着下次绘制标签时,swing 将使用新的模型状态(新文本)。当你冻结这个线程并退出应用程序时,你没有机会用新文本重新绘制标签。

EDT - 是一个特殊线程,所有组件都在屏幕上绘制。当您调用 Thread#sleep() 时,您会阻止 EDT,并且 swing 无法重绘您的标签。睡眠结束后,您退出进程,Swing 无法重新绘制新文本。

尝试删除System.exit() 调用。

如果您想在标签更改 5 秒后退出您的应用程序,您可以在单独的线程中调用 System#exit()。就像在任何多线程环境中一样,您不能完全等待 5 秒,您可以建议操作系统调度程序在大约 5 秒内执行操作。这将取决于 CPU 上的 CPU 负载。但在正常环境中,它应该在标签更改时模拟一些暂停

考虑以下代码(它不是生产级别,但应该可以工作):

new Thread(new Runnable()  //create new thread
    @Override
    public void run() 
        try 
            Thread.sleep(5000); //wait here
         catch(InterruptedException ex) 
            ex.printStackTrace();
        
        System.exit(0); //kill Java process
    
).start(); //start new thread
//EDT thread should continue executing

【讨论】:

你能告诉我代码应该是怎样的吗? 那么我要怎么退出我的程序呢?我希望它退出:P @DakshShah 那么您想以编程方式更改 UI 状态并关闭程序吗? 是的,但是标签文本更改后,我想等待 5 秒 @DakshShah 就像在任何多线程环境中一样,您不能完全等待 5 秒,您只需建议操作系统调度程序在大约 5 秒内执行操作。这将取决于 CPU 上的 CPU 负载。但在正常环境中,它应该在标签更改时模拟一些暂停。【参考方案2】:
   Done.setText("Done!");
    try 
       Thread.sleep(5000);
       System.out.println("Done!");
    catch(InterruptedException ex) 
         Thread.currentThread().interrupt();
     
   System.exit(0);

【讨论】:

以上是关于Java:语句未按顺序执行的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 查询未按正确顺序执行?

NodeJS HTTP请求未按顺序执行

ViewDidLoad 未按正确顺序执行操作 - Firebase、Swift

AWS Device Farm上的Appium测试未按指定顺序执行

在 foreach 循环中死亡时未按良好顺序执行的行

Apache梁管道Java:记录未按顺序写入目标文件