java線程的一些問題

   標題取名可能有點讓人家誤會,好像搞起來我講的是一些很深奧的問題,其實我主要講的是幾個方法,至於我講的內容的準確性,我也很難保證,畢竟自己也是菜鳥,希望不會誤導人家,但是,正因爲我是菜鳥,所以我講的可能會通俗易懂,讓同樣也是菜鳥的鳥,豁然開朗,好,廢話不多說。


   先講2個方法stop,suspend2個方法顧名思義 一個是停止線程,一個是掛起線程,但是他們有個共同點,他們都不釋放對象鎖,這樣的話很容易造成死鎖。爲什麼呢?

   

   當你正在執行該線程的run方法時,你用suspend或者stop方法後,線程被掛起,或者被停止,讓其他線程運行,但是如果得到cpu的那個線程與你剛纔掛起或停止的那個線程是同步關係,即運用了同一個對象鎖的話,這個線程是無法運行的,因爲剛纔你把線程掛起或停止後,並未釋放該對象鎖,釋放對象鎖一個2種方法,一個是sychronized語句執行完成,在sychronized語句中調用對象鎖的wait方法釋放對象鎖,顯然調用了stop或者suspend後是無法滿足上面2個的任意一個要求,所以對象鎖不會被釋放,該同步代碼就進入了一個死鎖的狀態。所以早在jdk1.2中就不棄用了這2種方法。


   下面主要講的是sleep和wait的區別,這個比較重要,我覺得面試可能會考的比較多。我也上網查了一下,感覺他們說的都比較晦澀,對於我們這麼菜鳥級別的人來說,就比較難懂了,我也不敢說我搞的很懂,但我儘量用自己的話來講,讓大家看的不是那麼辛苦。


   首先sleep是線程的方法,wait是object的方法,最重要的是調用了sleep後,運行的進程進入睡眠狀態,讓出cpu給其他進程,但是不釋放對象鎖。wait讓出cpu,進入阻塞狀態,釋放對象鎖。還有一個就是用喚醒,sleep用interrupt方法,wait用notify方法,前者是Thread方法後者是Object的方法。

喚醒後都進入可運行狀態,等待調用。


下面有一段代碼,幫助大家更好理解wait和sleep的區別,希望對大家有幫助。


public class MultiThread {

public static void main(String[] args) {

new Thread(new Thread1()).start();

try{

Thread.sleep(10);

}catch(InterruptedException e){

e.printStackTrace();

}

new Thread(new Thread2()).start();

}

private static class Thread1 implements Runnable{

public void run(){

synchronized(MultiThread.class){

System.out.println("enter thread1...");

System.out.println("thread is waiting");

try {

MultiThread.class.wait();

//wait釋放對象鎖,所以Thread2可以運行,如果改爲Thread.sleep,那麼Thread2就無法運行了

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("thread1 is going on..");

System.out.println("thread1 is being over!");

}

}

}

private static class Thread2 implements Runnable{

public void run(){

synchronized(MultiThread.class){

System.out.println("enter thread2...");

System.out.println("thread2 notify other can release wait status..");

MultiThread.class.notify();//喚醒wait的Thread1

System.out.println("thread2 is sleeping ten millisecond..");

try{

Thread.sleep(10);//sleep不釋放對象鎖,所以Thread1就算得到cpu也無法運行

}catch(InterruptedException e){

e.printStackTrace();

}

System.out.println("thread2 is going on...");

System.out.println("thread2 is being over!");

}

}

}

}


輸出結果是:

enter thread1...

thread is waiting

enter thread2...

thread2 notify other can release wait status..

thread2 is sleeping ten millisecond..

thread2 is going on...

thread2 is being over!

thread1 is going on..

thread1 is being over!


我相信以大家的聰明才智一定能看懂滴,我就不做過多的解釋了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章