Java 我的线程有问题。sleep()

Java 我的线程有问题。sleep(),java,multithreading,thread-sleep,Java,Multithreading,Thread Sleep,我正在创建一个简单的视频扑克程序,现在我正在处理在用户指定他想要持有的卡后执行的操作,并在抽签后用新卡替换丢弃的卡。我有一个动作,我想一张一张地更换卡,在所有更换之间有一个延迟,但根据下面的代码,它将休眠500毫秒,乘以我必须更换的卡的数量,然后一次更换所有卡,而不是按照我的要求一次更换一张。非常感谢您的帮助 Action drawAction = new AbstractAction() { public void actionPerformed(ActionEvent e)

我正在创建一个简单的视频扑克程序,现在我正在处理在用户指定他想要持有的卡后执行的操作,并在抽签后用新卡替换丢弃的卡。我有一个动作,我想一张一张地更换卡,在所有更换之间有一个延迟,但根据下面的代码,它将休眠500毫秒,乘以我必须更换的卡的数量,然后一次更换所有卡,而不是按照我的要求一次更换一张。非常感谢您的帮助

Action drawAction = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            int deckPos = 5;

            if((holdValFirst.getText()).equals("HELD")){}
            else{                   
                holdFirst.setIcon(new ImageIcon(((deck.getDeck())[deckPos]).getCardName()+".gif"));
                deckPos++;
                try
                {
                    Thread.sleep(500);              
                }catch (InterruptedException ie){
                    System.out.println(ie.getMessage());
                }
            }
            if((holdValSecond.getText()).equals("HELD")){}
            else{                   
                holdSecond.setIcon(new ImageIcon(((deck.getDeck())[deckPos]).getCardName()+".gif"));
                deckPos++;
                try
                {
                    Thread.sleep(500);              
                }catch (InterruptedException ie){
                    System.out.println(ie.getMessage());
                }               
            }
            if((holdValThird.getText()).equals("HELD")){}
            else{
                holdThird.setIcon(new ImageIcon(((deck.getDeck())[deckPos]).getCardName()+".gif"));
                deckPos++;
                try
                {
                    Thread.sleep(500);              
                }catch (InterruptedException ie){
                    System.out.println(ie.getMessage());
                }                   
            }
            if((holdValFourth.getText()).equals("HELD")){}
            else{                   
                holdFourth.setIcon(new ImageIcon(((deck.getDeck())[deckPos]).getCardName()+".gif"));
                deckPos++;  
                try
                {
                    Thread.sleep(500);              
                }catch (InterruptedException ie){
                    System.out.println(ie.getMessage());
                }               
            }
            if((holdValFifth.getText()).equals("HELD")){}
            else{                                       
                holdFifth.setIcon(new ImageIcon(((deck.getDeck())[deckPos]).getCardName()+".gif"));
                deckPos++;                                  
            }               
        }
    };

当您在事件调度线程EDT中睡眠时,GUI被冻结。每个长时间运行的任务都应该在EDT之外完成,所有的摆动操作都应该在EDT中完成


您应该使用SwingWorker在另一个线程中睡眠,并每500毫秒发布一次进度。或者您可以使用javax.swing.Timer,它将每隔500毫秒触发一个事件。

当您在事件调度线程EDT中睡眠时,GUI将被冻结。每个长时间运行的任务都应该在EDT之外完成,所有的摆动操作都应该在EDT中完成


您应该使用SwingWorker在另一个线程中睡眠,并每500毫秒发布一次进度。或者您可以使用javax.swing.Timer,它将每隔500毫秒触发一个事件。

代码中存在大量重复。您可能应该为所有ifs的else部分编写一个方法……可能的重复代码中存在大量重复。您可能应该为所有ifs的else部分编写一个方法…可能重复