Java:语句没有按顺序执行

时间:2014-02-08 08:42:28

标签: java multithreading swing sleep

我正在执行以下代码:

    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秒钟,然后程序关闭。但正在发生的事情是;它会打印然后等待5秒,但它永远不会将完成的标签设置为完成! 为什么呢?

更新1 请注意,如果我只是删除了sleep try和catch块,那么它会完成该操作,然后正确显示已完成但不存在睡眠块的情况

更新2 为什么不首先输出然后再睡觉?为什么? [就像在答案中他们说它会挂起,好吧我得到了但如果我写了它应该设置标签它应该设置它然后暂停后设置它为什么之前???]

如果还不清楚:看看我想做的是,1。让一些物品看不见2.更改标签的文字3.等待5秒4.自动退出 按照这个确切的顺序。

2 个答案:

答案 0 :(得分:3)

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

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

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

如果您想在标签更改后5秒钟退出应用程序,则可以在单独的线程中进行System#exit()调用。就像在任何多线程环境中一样,您不能等待5秒,您可以建议OS调度程序在大约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

答案 1 :(得分:0)

   Done.setText("Done!");
    try {
       Thread.sleep(5000);
       System.out.println("Done!");
   } catch(InterruptedException ex) {
         Thread.currentThread().interrupt();
     }
   System.exit(0);