程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> java-Java 多線程問題求解....

java-Java 多線程問題求解....

編輯:編程綜合問答
Java 多線程問題求解....

public class SigleThread extends Thread {

@Override
public void run() {
    for (int i = 0; i < 5; i++) {
        System.out.println(i);
        try {
            join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

}

public class Test {
public static void main(String[] args) {
SigleThread sing = new SigleThread();
sing.start();
}
}

這個時候控制台在輸出0之後....就會處於卡死狀態....為什麼會這樣????求大神解惑~~~

而換成下面這種調用方式就沒問題....

public class Test {
public static void main(String[] args) {
Runnable sing = new SigleThread();
Thread t = new Thread(sing);
t.start();
}
}

這種調用就會打印0 1 2 3 4 5然後正常結束....請問到底是什麼原理??

最佳回答:


主要的原因是樓主沒搞清楚,run方法裡面的this指的是誰。

看我貼的代碼,樓主拿去運行下this是誰。語句後面我寫了注釋,樓主注意看下。

 public class SigleThread extends Thread{
    @Override
    public void run() {

        System.out.println(this); //this是 sing對象

        System.out.println(this.isAlive()); //sing是個線程,但是此線程並沒有start,它不是活的

        for (int i = 0; i < 5; i++) {
            System.out.println(i);
            try {
                this.join(); //關鍵是在這裡。join時檢測this是否是活的(可以去看下join的源碼),也就是檢測isAlive是不是返回true。
                            //如果是,則線程等待,即wait(0),在沒有被notify之前,就阻塞在那裡。也就是樓主說的卡死在那裡了。
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
 public class Test {
    public static void main(String[] args){

        Runnable sing = new SigleThread();//new了一個線程。叫Thread-0
        System.out.println(sing);
        Thread t = new Thread(sing);//又new了一個線程。叫Thread-1。Thread-1啟動後,run方法裡面的this是指sing,而不是t自己,執行的是sing的run方法。
        System.out.println(t);
        t.start(); //Thread-1啟動。但Thread-0並沒有啟動。

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