簡體   English   中英

Java在啟動新線程之前會自動等待線程完成

[英]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.

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