Java:语句没有按顺序执行



我正在执行以下代码:

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);

根据我的说法,应该发生什么:"完成"标签设置为文本"完成!",然后打印ln,然后等待5秒,然后程序关闭。但现在发生的是;它确实打印ln,然后等待5秒,但它从未将done标签设置为done!为什么?

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

更新2为什么它不先输出,然后休眠?为什么?[就像在回答中他们说它会挂起,好吧,我明白了,但如果我写了它应该设置标签,它应该设置它,然后在设置后暂停,为什么之前??]

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

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

EDT-是一个特殊的线程,所有组件都在屏幕上绘制。当您调用Thread#sleep()时,您会阻止EDT,swing无法重新绘制您的Label。睡眠结束后,退出进程,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
Done.setText("Done!");
try {
Thread.sleep(5000);
System.out.println("Done!");
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
System.exit(0);

最新更新