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:语句未按顺序执行的主要内容,如果未能解决你的问题,请参考以下文章
ViewDidLoad 未按正确顺序执行操作 - Firebase、Swift