![](/img/trans.png)
[英]@Async in SpringBoot creating new thread but Controller waits for async call to finish before sending a response back
[英]Java automatically waits for thread to finish before starting a new one
使用以下代码:
package myapp;
class Runner extends Thread {
public void run(){
for(int i = 0; i < 11; i++){
System.out.println("Hello " + i);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Class1 {
public static void main(String[] args){
Runner t1 = new Runner();
t1.start();
Runner t2 = new Runner();
t2.start();
}
}
我得到以下输出:
Hello 0
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
Hello 6
Hello 7
Hello 8
Hello 9
Hello 10
Hello 0
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
Hello 6
Hello 7
Hello 8
Hello 9
Hello 10
而我的输出应如下所示:
Hello 0
Hello 0
Hello 1
Hello 1
Hello 2
Hello 2
Hello 3
Hello 3
Hello 4
Hello 4
Hello 5
Hello 5
Hello 6
Hello 6
Hello 7
Hello 7
Hello 8
Hello 8
Hello 9
Hello 9
Hello 10
Hello 10
怎么了 我正在使用Eclipse Standard / SDK版本:Kepler版本
内部版本号:20130614-0229,jre7u25和jdk7u25。
这是你的问题:
for(int i = 0; i < 11; i++){
System.out.println("Hello " + i);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
您首先要经历整个循环,然后才入睡。 移动睡眠for循环内部 ,看看会发生什么。
第一个输出是正确的,并且您期望的也是正确的。 一百万次尝试中的概率为1。
虽然有多个线程,但是您不能以让任何特定线程有机会运行为己任。 一旦调度到jvm(如果是本机程序,则分配给CPU),它取决于jvm如何以及何时运行什么线程。
第一个输出是正确的bcz,代码是如此之小,以至于在线程需要切换之前,它就已经完成了任务。 这就是为什么不干预输出的原因。 也许您可以尝试更大的迭代次数,例如>10000
这样您就可以理解这个概念。 或者您可以尝试运行代码多次。 您可能(可能)从同一代码获得不同的输出。
附言:将sleep
作为最后一条指令,实际上没有任何作用,因为线程几乎已经耗尽了生命,而您只是在等待死亡。
如果两个线程具有相同的优先级,则不能保证执行顺序(两次运行同一程序可能会产生不同的结果),并且它取决于托管的操作系统,因为它的工作是在线程之间分配CPU。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.