![](/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.