簡體   English   中英

關於執行順序的線程和混淆

[英]Threads and confusion about the order of execution

我只是無法理解程序執行的順序。

public class sub  {
    public static void main(String args[])
    {
        base b1 = new base();
        b1.s="b1";
        b1.start();
        base b2 = new base();
        b2.s="b2 ";
        b2.start();

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }  
}

public class base extends Thread{

    String s;
    @Override
    public void run() {
    for(int i=0;i<5;i++)
    {
        System.out.println(s+" "+i);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    // TODO Auto-generated method stub

}


}

輸出是

b2  0
b1 0
b2  1
b1 1
b2  2
b1 2
b1 3
b2  3
b2  4
b1 4

任何人都可以解釋為什么輸出是按這個順序排列的。 為什么第一個 b2 在 b1 之前執行而不是 b1 在 b2 之前執行。 那么為什么 b1 首先執行。

不能保證選擇一個線程在另一個線程之前運行。 在這種情況下,可能發生的情況是調度程序試圖避免上下文切換,因此它將嘗試保持主線程運行。 啟動新線程也需要時間。 也許到主線程進入睡眠狀態時 b1 和 b2 都啟動了,哪個先開始運行,哪個被選擇獲取 stdout 打印流上的鎖,此時都是任意選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM