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 秒
- 你说鲍勃
- 等待 1 秒
- 你说你自己的名字
当你说 Alice 时,Alice 回复了她的名字,这发生在你等待的时候。鲍勃似乎在等待,从某种意义上说,他在等你说出他的名字(开始他的话题)。当然,Alice 总是(或几乎总是)在 Bob 之前说出她的名字。没过一秒钟,爱丽丝就听到了她的名字并友善地回答。将此与以下执行进行对比:
- 你说爱丽丝
- 你说鲍勃
- 等待 2 秒
- 你说你自己的名字
在这种范式中,您实际上并不知道先说哪个名字。你先说的是 alice,但两者之间没有 space 所以这取决于 Alice 和 Bob 中谁的反应更快。这对应于:
t1.start();
t2.start();
Thread.sleep(2000);
System.out.println("main");
- 线程 2 在调用其 start() 之前不处于 运行 状态。
- 第一个 Thread.sleep(1000) 使主线程暂停。
修改以下代码可以达到您的预期:
thread1.start();
thread2.start();
Thread.sleep(2000);
我在这里看到了类似的问题,但我认为我的问题不是重复的。 我无法理解这个例子:
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 秒
- 你说鲍勃
- 等待 1 秒
- 你说你自己的名字
当你说 Alice 时,Alice 回复了她的名字,这发生在你等待的时候。鲍勃似乎在等待,从某种意义上说,他在等你说出他的名字(开始他的话题)。当然,Alice 总是(或几乎总是)在 Bob 之前说出她的名字。没过一秒钟,爱丽丝就听到了她的名字并友善地回答。将此与以下执行进行对比:
- 你说爱丽丝
- 你说鲍勃
- 等待 2 秒
- 你说你自己的名字
在这种范式中,您实际上并不知道先说哪个名字。你先说的是 alice,但两者之间没有 space 所以这取决于 Alice 和 Bob 中谁的反应更快。这对应于:
t1.start();
t2.start();
Thread.sleep(2000);
System.out.println("main");
- 线程 2 在调用其 start() 之前不处于 运行 状态。
- 第一个 Thread.sleep(1000) 使主线程暂停。
修改以下代码可以达到您的预期:
thread1.start(); thread2.start(); Thread.sleep(2000);