首頁  >  問答  >  主體

java - new了2个Thread,为什么不是交叉打印?

public static void main(String[] args){

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=0; i<10; i++){
                    System.out.print(i+" ");
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=0; i<10; i++){
                    System.out.print(i+" ");
                }
            }
        }).start();
    }

输出结果如下:

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 
PHPzPHPz2763 天前1477

全部回覆(13)我來回復

  • 阿神

    阿神2017-04-18 10:29:18

    cpu的執行速度太快,數字太小看不出差距.要是我,起碼Integer.MaxValue.

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:29:18

    如果沒有同步鎖,這兩個執行緒是不會出現你說的交叉列印的,執行緒的執行的優先順序在於誰先取得了cpu資源,你的程式並不能保證哪個執行緒先執行。再好好看看java多執行緒知識吧。

    回覆
    0
  • 迷茫

    迷茫2017-04-18 10:29:18

    設定的次數太少,如果你設定100個數就能看到兩個執行緒交叉(這裡的交叉不是執行緒1列印一個數,執行緒2馬上列印一個數,而是一段一段的)列印的效果;cpu搶到資源就執行了。你要實現交叉列印的話,那是個生產這與消費者的例子。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-18 10:29:18

    就輸出完10個數字太快了,把10改成100試試。

    回覆
    0
  • 黄舟

    黄舟2017-04-18 10:29:18

    加上個執行緒休眠時間

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:29:18

    0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 我的是這樣的!自己想吧

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 10:29:18

    在兩個for迴圈裡面輸出語句前加上Thread.sleep(1000);
    再試試看

    回覆
    0
  • 阿神

    阿神2017-04-18 10:29:18

    執行緒是不保證執行順序的。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 10:29:18

    執行緒的執行順序是不確定的,誰搶占到cpu誰就執行,十個數字的順序也不一定是你這樣的,你多執行幾次就會出現不同的結果。而且執行緒的優先權也無法保障執行緒的執行次序。只不過優先順序高的執行緒取得 CPU 資源的機率大一點而已。

    回覆
    0
  • 迷茫

    迷茫2017-04-18 10:29:18

    public void run() {
                    for (int i=0; i<10; i++){
                        System.out.print(i+" ");
                        Sleep(1000);
                    }
                }

    這樣能看到比較明顯的交叉列印現象,但實際上並髮指的是我們無法得知哪個執行緒先執行哪個執行緒後
    執行,而不是一定會交叉。誇張地說,對兩個執行緒的分別m, n條組合指令做插入,可以有
    C_{m+n-1}^{min(m,n)}階乘級數的執行順序。

    回覆
    0
  • 取消回覆