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 

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

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

当您的程序启动时,它从 "Main" 线程开始,

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

将您的程序想象成一根绳子(线程),当您 运行 您的程序 (Thread.start) 时,您开始将珠子放在那根绳子(您的代码)上。这意味着必须一个接一个地继续,如果你睡觉(Thread.sleep)就像你在你指定的时间放下那根线,所以你不再在上面放珠子(简单类比那些那不明白)。

你所做的是获得你的第一个线程(主线程)然后启动 2 个新线程(t1,t2)但它们目前还不能正常工作,当你调用 Thread.start() 它们就可以正常工作.您当前的功能线程(主线程)有一个睡眠命令,该命令将暂停该线程中的所有 activity 1 秒。 所以你的程序是这样排序的:创建线程1和2(t1,t2),启动线程1(t1)然后暂停1秒,然后启动线程2(t2),然后暂停一秒,然后打印字符串"main";

您似乎在强迫 t2 等待,因为在 t1 启动时您还没有启动 t2

假设你加上两个助手,Alice 和 Bob。你告诉他们两个,当你说出他们的名字时,他们应该说出他们的名字来回应。您当前的执行是:

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

当你说 Alice 时,Alice 回复了她的名字,这发生在你等待的时候。鲍勃似乎在等待,从某种意义上说,他在等你说出他的名字(开始他的话题)。当然,Alice 总是(或几乎总是)在 Bob 之前说出她的名字。没过一秒钟,爱丽丝就听到了她的名字并友善地回答。将此与以下执行进行对比:

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

在这种范式中,您实际上并不知道先说哪个名字。你先说的是 alice,但两者之间没有 space 所以这取决于 Alice 和 Bob 中谁的反应更快。这对应于:

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

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