繁体   English   中英

Thread.sleep()方法如何工作?

[英]How does Thread.sleep() method work?

我在这里看到了类似的问题,但我认为我不是重复的。 我无法理解此示例:

public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread() {
        public void run() {
            System.out.println("t1");
        }
    };

    Thread t2 = new Thread() {
        public void run() {
            System.out.println("t2");
        }
    };


    t1.start();
    Thread.sleep(1000);
    t2.start();
    Thread.sleep(1000);

    System.out.println("main");
}

为什么它总是以相同的顺序打印线程名称?

t1
//1 sec pause
t2
//1 sec pause
main 

为什么在t1.start() Thread.sleep(1000)之后Thread.sleep(1000)强制t2线程等待? 为什么t2不能立即开始执行run方法?

将您的程序视为一个字符串(线程),当您运行程序(Thread.start)时,您开始将珠子放在该字符串(您的代码)上。 这意味着一个线程必须在另一个线程之后继续进行,如果您休眠(Thread.sleep)的方式就像您在指定的时间内放下那条线程,那么就不再在其上放置小珠了(对于那些不明白)。

完成的工作是获得第一个线程(主线程),然后启动2个新线程(t1,t2),但它们目前还无法正常工作,当您调用Thread.start()时,它们就可以正常工作了。 您当前的功能线程(主线程)具有一个sleep命令,该命令将使该线程中的所有活动暂停一秒钟。 因此,您的程序的排序如下:创建线程1和2(t1,t2),启动线程1(t1),然后暂停1秒钟,然后启动线程2(t2),然后暂停一秒钟,然后打印字符串“主要”;

因为此代码中的sleep方法具有运行main()的线程,所以在启动另一个线程与启动下一个线程之间要暂停一秒钟。

程序启动时,它从“主”线程开始,

调用“ Thread.start()”派生执行(导致t1并行开始),然后告诉“ Main”线程休眠1秒钟,然后启动第二个线程,最后打印“ Main”

似乎您正在强迫t2等待,因为t1启动时您尚未启动t2

考虑您加上两位助手,爱丽丝和鲍勃。 您告诉他们两个,当您说出他们的名字时,他们应该通过说出他们的名字来回应。 您当前的执行是:

  1. 你说爱丽丝
  2. 等待1秒钟
  3. 你说鲍勃
  4. 等待1秒钟
  5. 你说自己的名字

当您说爱丽丝(Alice)时,爱丽丝(Alice)会回复她的名字,这是在您等待时出现的。 鲍勃似乎在等待,并且在某种程度上,他正在-等待您说出他的名字(开始他的话题)。 当然,爱丽丝会始终(或几乎总是)在鲍勃面前说出自己的名字。 爱丽丝无需花一秒钟的时间就能听到她的名字并以实物形式答复。 将此与以下执行进行对比:

  1. 你说爱丽丝
  2. 你说鲍勃
  3. 等待2秒
  4. 你说自己的名字

在这种范例中,您实际上并不知道首先要说哪个名称。 您首先说过爱丽丝,但是两者之间没有空格,因此要取决于爱丽丝和鲍勃的反应速度更快。 这将对应于:

t1.start();
t2.start();
Thread.sleep(2000);
System.out.println("main");
  1. 直到调用其start()为止,thread2才处于运行状态。
  2. 第一个Thread.sleep(1000)使主线程暂停。
  3. 修改以下代码可以达到您的期望:

     thread1.start(); thread2.start(); Thread.sleep(2000); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM