Java 如何在线程';s sleep()方法立即执行

Java 如何在线程';s sleep()方法立即执行,java,multithreading,thread-sleep,Java,Multithreading,Thread Sleep,我试图通过调用Thread类的sleep()方法暂停部分程序的执行几秒钟。但是,当我尝试此操作时,调用之后立即出现的代码仍然会立即执行。例如,如果我有代码: Thread compoundThread = new Thread(new Runnable() { public void run() { try { Thread.currentThread().sleep(200

我试图通过调用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();
                }

displaycomoundstimultium
方法显示一组
jlabel
,当我不包括您刚才提到的线程休眠位置的代码时,该方法不会延迟。但是,当我包含使线程进入睡眠状态的代码时,图像的显示也会延迟两秒,这很奇怪,因为
thread.sleep()
在图像显示后执行。

我建议您使用simple

thread.sleep(2000)

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

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

紧接着,主线程在不停止的情况下继续执行并到达print语句。因此,主线程正在打印第15行


您启动的second线程休眠2秒,然后终止。如果在
sleep
调用之后将print语句放入线程的
run
方法中,那么在打印
第15行之前会有2秒钟的暂停
这里
compoundThread
是一个新的线程对象。您的
行15
通过main方法执行。因此,当您启动
compoundThread.start()
时,将创建一个新线程,并独立于主线程启动


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

代码的行为与实现的相同。您正在运行主线程,该线程启动另一个线程,该线程休眠2000毫秒

因此,您的主线程执行以下操作:

  • 启动复合线程
  • 打印出来
  • 精加工主螺纹
  • 根据您想要实现的目标,您可以删除整个线程并执行以下操作:

    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”之后两秒。线程将睡眠两秒钟。

    原始线程(主线程)启动一个新线程,新线程睡眠两秒钟。原始线程没有,这就是为什么它会立即打印“第15行”。因此,Sandeep的建议虽然简洁,但如果您理解并正确应用它,它应该会起作用。另一个明显的可能性是将
    System.out.println
    语句放在
    compoundThread
    run
    方法中


    查看并告诉我它是否起作用

    你能为你的代码添加行号吗?我不知道怎么做,但System.out.println(“第15行”)是第15行。一个线程将在另一个执行上下文中执行;你期待什么?那么你是说在run方法中有打印行吗?谢谢你的详细解释。我现在明白了。@siegi该死的,我错过了那个解决方案:)你关于删除整个线程的建议给我带来了问题,因为它也会将thread.sleep()行之前的打印语句的执行延迟两秒,我不知道为什么。你能提供完整的代码来理解你的意思吗?对不起,不是打印语句,我指的是我显示的图像。我的代码在jpanel中显示了一些JLabel。但是,当我使用thread.sleep()使主线程进入睡眠状态时,现在不仅打印语句,图像显示也会延迟两秒钟,尽管图像应该在线程进入睡眠状态之前显示,这是没有意义的。图像显示没有延迟,但是当我在显示图像的行之后添加代码行:Thread.sleep()时,图像显示也会延迟两秒。@lb91:我猜您使用的是
    打印
    ,而不是
    线程.sleep()之前的
    打印ln
    。Java(确切地说是
    PrintWriter
    )仅在使用
    println
    时才会自动刷新。使用
    System.out.flush()
    在执行
    Thread.sleep()
    之前强制刷新。另请参见。我发现,当我这样做时,它最终会将Thread.sleep(2000)之前的代码执行速度降低两秒。例如,如果我在Thread.sleep(2000)方法之前放一条print语句,在Thread.sleep(2000)方法之后放一条print语句,这两条print语句将同时打印,这对我来说毫无意义。@lb91就是这样。这取决于您希望睡眠的时间和线程。正如其他答案所指出的,如果您在外部使用它,它将降低主线程的速度,在runnable内部,它将降低该线程的特定实例的速度。@Sandeep:欢迎使用StackOverflow!您可以随时编辑答案(使用下面的链接)。特别是对于发布代码,注释不太合适。在答案中直接使用代码块。请参阅以了解如何正确设置格式。