程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> java多線程問題-有一道Java面試題,沒太理解明白,求大神指點啊~

java多線程問題-有一道Java面試題,沒太理解明白,求大神指點啊~

編輯:編程解疑
有一道Java面試題,沒太理解明白,求大神指點啊~

package test2;
/**

  • 設計4個線程,其中兩個線程每次對i增加1,另外兩個線程對i每次減少1
  • @author liuyu
    *
    */
    public class Test {

    private int i ;

    private synchronized void inc(){

    i ++;

    System. out .println(Thread.currentThread().getName()+ "--inc--" + i );

    }

    private synchronized void dec(){

    i --;

    System. out .println(Thread.currentThread().getName()+ "--dec--" + i );

    }

    class Inc implements Runnable {

    public void run() {

    inc();

    }

    }

    class Dec extends Thread{

    public void run() {

    dec();

    }

    }

    public static void main(String[] args) {

    Test t = new Test();

    Inc inc = t. new Inc();

    Thread thread = null;

    // 創建 2 個增加線程

    for ( int i = 0; i < 2; i++) {

    thread = new Thread(inc);

    thread.start();

    }

    // 創建 2 個減少線程

    for ( int i = 0; i < 2; i++) {

    thread = t.new Dec();

    thread.start();

    }

    }

    }

輸出:Thread-0--inc--1
Thread-3--dec--0
Thread-2--dec---1
Thread-1--inc--0

可是我感覺應該輸出是:
Thread-0--inc--1
Thread-1--inc--2
Thread-2--dec--1
Thread-3--dec--0

因為按照執行順序,當執行第一個for循環第一次的時候創建第一個線程,並且i加1,執行第二次for循環的時候i再加1等於2;
執行第二個for循環的時候,創建第三個線程,並且i減1,執行第二次的後事i再減1等於0

為什麼不對呢?

最佳回答:


鹵煮的想法沒錯,程序確實是一步一步從上往下執行的,也創建了四個線程,之所以沒有出現預期的結果,可能是有一點被忽略了,java中的線程有自己的生命周期,一個新的線程會經歷創建、就緒然後才能進入執行狀態。也就是說你的程序創建了四個線程,它們只是進入了就緒狀態,等待cpu線程棧的調度,而何時可以得執行以及執行的順序還要依賴cpu的性能、cpu的個數等等。所以程序的輸出結果應該是未知的,鹵煮可以多跑幾次,應該會輸出不同內容。嘿嘿。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved