如何在Thread的sleep()方法立即执行后停止代码

时间:2016-03-21 05:38:10

标签: java multithreading thread-sleep

我试图通过调用Thread类的sleep()方法暂停执行部分程序几秒钟。但是,当我尝试此操作时,此调用后立即执行的代码仍会立即执行。例如,如果我有代码:

Thread compoundThread = new Thread(new Runnable()
{                       
    public void run() 
    {
        try 
        {
            Thread.currentThread().sleep(2000);
        } 
        catch (InterruptedException e) 
        {
            // TODO Auto-generated catch block
            Thread.currentThread().interrupt();
        }               
    }

});

compoundThread.start();

System.out.println("line 15")

第15行立即打印。有没有解决这个问题的方法?我认为sleep()方法的整个想法是暂停执行。

编辑以回应Philipp的评论

while (totalNoOfPhase1Trials > 399)
{           //
                Phase1Trial phase1Trial = new Phase1Trial(numberOfElements, elementColors);

                displayComplexStimulus(phase1Trial.getComplexStimulus());
                validate();

                Thread compoundThread = new Thread(new Runnable(){

                    public void run() {
                        try {
                            Thread.currentThread().sleep(2000);
                            System.out.println("line 226");
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block

                        }


                    }

                });



                compoundThread.start();     
                try {
                    compoundThread.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

{I} displayCompoundStimulus方法显示一组jlabels,当我没有包含你刚才提到的线程进入睡眠状态的代码时,没有任何延迟。但是,当我包含使线程进入休眠状态的代码时,图像的显示也会延迟两秒,这很奇怪,因为Thread.sleep()在显示图像后执行。

6 个答案:

答案 0 :(得分:3)

代码表现为已实现。您正在运行主线程,它启动另一个线程,该线程休眠2000毫秒。

所以你的主线程确实如此:

  1. 启动compoundThread
  2. 打印
  3. 完成主线程
  4. 根据您想要实现的目标,您可以删除整个线程并执行:

    try {
       Thread.sleep(2000);
    } catch (InterruptedException e) {
       // should not happen, you don't interrupt                     
    }
    System.out.println("line 15");
    

    否则,您可以将输出移动到线程的run方法中:

    Thread compoundThread = new Thread(new Runnable(){
    
        public void run() {
            try {
                Thread.sleep(2000);
                System.out.println("line 15");
            } catch (InterruptedException e) {
                // do whatever has to be done
            }
        }
    });
    
    compoundThread.start();
    
    // you might want to wait until compoundThread is done
    compoundThread.join();
    

    更新:根据您对延迟输出的评论

    如果您使用以下代码:

    public static void main(String[] args) {
        System.out.println("Hello");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // should not happen, you don't interrupt
        }
        System.out.println("World");
    }
    

    输出将为“Hello”,并在“World”之后两秒。线程将睡两个小时。

答案 1 :(得分:1)

主线程是开始运行main方法的线程。

然后,您的main方法创建一个新的Thread对象并调用compoundThread.start();,这会导致第二个线程开始执行。

之后,不停止主线程继续执行并到达print语句。因此主线程正在打印line 15

你开始的secnond线程睡了2秒然后终止。如果您在run调用后将print语句放在线程的sleep方法中,那么在打印line 15之前会有2秒的暂停。

答案 2 :(得分:1)

这里compoundThread是一个新的线程对象。您的line 15是通过main方法执行的。因此,当您启动compoundThread.start()时,将创建一个新线程并独立于主线程启动。

如果您想减慢主线程的速度,只需在可运行的对象代码外部使用Thread.sleep(2000)即可。

答案 3 :(得分:0)

原始线程(主线程)启动一个新线程,新线程休眠两秒钟。原始线程没有,这就是为什么它打印"第15行"立即。因此,如果你理解并正确应用它,Sandeep的建议虽然简洁,但应该有效。另一个显而易见的可能性是将System.out.println语句放在run的{​​{1}}方法中。

答案 4 :(得分:0)

Screenshot

有一个观点&告诉我它是否有效

答案 5 :(得分:-2)

我建议你使用简单的

thread.sleep(2000)