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並沒有啟動。
}
}