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

时间:2015-01-25 14:35:15

标签: java multithreading

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

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 

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

5 个答案:

答案 0 :(得分:3)

将您的程序视为一个字符串(Thread),当您运行程序(Thread.start)时,您开始在该字符串(您的代码)上放置珠子。这意味着一个人必须继续前进,如果你睡觉(Thread.sleep)它就像你指定的时间放下那条线程一样,所以你不再在它上面放置珠子(简单的类比,对于那些#39;了解)。

你所做的是获得你的第一个线程(主)然后启动2个新线程(t1,t2)但是它们还没有起作用,当你调用Thread.start()时它们变得有用了。您当前的功能线程(主)具有睡眠命令,该命令将暂停该线程中的所有活动1秒钟。 所以你的程序是这样排序的:创建线程1和2(t1,t2),启动线程1(t1)然后暂停1秒,然后启动线程2(t2),然后暂停一秒钟,然后打印字符串& #34;主&#34 ;;

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

考虑你和两位助手,Alice和Bob。你告诉他们两个人,当你说出他们的名字时,他们应该回答说出他们的名字。您当前的执行是:

  1. 你说爱丽丝
  2. 等一下
  3. 你说鲍勃
  4. 等一下
  5. 你说出自己的名字
  6. 当你说爱丽丝时,爱丽丝会回复她的名字。好像鲍勃正在等待,在某种程度上他是 - 他等着你说出他的名字(开始他的线索)。当然,爱丽丝总是(或几乎总是)在鲍勃之前说出她的名字。爱丽丝听取她的名字并以实物回复并不需要一整秒的时间。将此与以下执行相对照:

    1. 你说爱丽丝
    2. 你说鲍勃
    3. 等待2秒
    4. 你说出自己的名字
    5. 在这个范例中,您实际上并不知道将首先说出哪个名称。你先说alice,但两者之间没有空间,所以它取决于Alice和Bob哪一个有更快的反应。这将对应于:

      t1.start();
      t2.start();
      Thread.sleep(2000);
      System.out.println("main");
      

答案 4 :(得分:0)

  1. 在调用start()之前,thread2不处于运行状态。
  2. 第一个Thread.sleep(1000)使主线程暂停。
  3. 以下代码修改后可以达到您的预期目标:

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