java單線程多線程的實現與方法

來源:文萃谷 2.73W

java中有幾種方法可以實現一個線程?用什麼關鍵字修飾同步方法?

java單線程多線程的實現與方法

stop()和suspend()方法為何不推薦使用? java5以前,有如下兩種:第一種:new Thread(){}t();這表示調用Thread子類對象的run方法,new Thread(){}表示一個Thread的匿名子類的實例對象,子類加上run方法後的代碼如下:new Thread(){ public void run(){ } }t();第二種:new Thread(new Runnable(){})t();這表示調用Thread對象接受的Runnable對象的run方法,new Runnable(){}表示一個Runnable的匿名子類的實例對象,runnable的子類加上run方法後的代碼如下:new Thread(new Runnable(){ public void run(){ } })t(); 從java5開始,還有如下一些線程池創建多線程的方式:ExecutorService pool = ixedThreadPool(3) for(int i=0;i<10;i++){ ute(new Runable(){public void run(){}}); } achedThreadPool()ute(new Runable(){public void run(){}});ingleThreadExecutor()ute(new Runable(){public void run(){}});前兩種實現方法,分別使用new Thread()和new Thread(runnable)形式,第一種直接調用thread的run方法,所以,我們往往使用Thread子類,即new SubThread()。第二種調用runnable的run方法。後兩種實現方法,分別是繼承Thread類與實現Runnable接口 用synchronized關鍵字修飾同步方法 反對使用stop(),是因為它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處於一種不連貫狀態,那麼其他線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來説,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出線程應該活動還是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()重新啟動線程。

java中線程的基本概念、線程的基本狀態以及狀態之間的關係

一個程序中可以有多條執行線索同時執行,一個線程就是程序中的一條執行線索,每個線程上都關聯有要執行的代碼,即可以有多段程序代碼同時運行,每個程序至少都有一個線程,即main方法執行的'那個線程。如果只是一個cpu,它怎麼能夠同時執行多段程序呢?這是從宏觀上來看的,cpu一會執行a線索,一會執行b線索,切換時間很快,給人的感覺是a,b在同時執行,好比大家在同一個辦公室上網,只有一條鏈接到外部網線,其實,這條網線一會為a傳數據,一會為b傳數據,由於切換時間很短暫,所以,大家感覺都在同時上網。 狀態:就緒,運行,synchronize阻塞,wait和sleep掛起,結束。wait必須在synchronized內部調用。

調用線程的start方法後線程進入就緒狀態,線程調度系統將就緒狀態的線程轉為運行狀態,遇到synchronized語句時,由運行狀態轉為阻塞,當synchronized獲得鎖後,由阻塞轉為運行,在這種情況可以調用wait方法轉為掛起狀態,當線程關聯的代碼執行完後,線程變為結束狀態。

當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法? 分幾種情況:1.其他方法前是否加了synchronized關鍵字,如果沒加,則能。2.如果這個方法內部調用了wait,則可以進入其他synchronized方法。3.如果其他個方法都加了synchronized關鍵字,並且內部沒有調用wait,則不能。4.如果其他方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因為非靜態的方法用的是this。

java中多線程有幾種實現方法?同步有幾種實現方法?

多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口 同步的實現方面有兩種,分別是synchronized,wait與notify wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。 sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。 notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。 Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

熱門標籤