- 相關(guān)推薦
java單線程多線程的實現(xiàn)與方法
java中有幾種方法可以實現(xiàn)一個線程?用什么關(guān)鍵字修飾同步方法?
stop()和suspend()方法為何不推薦使用? java5以前,有如下兩種:第一種:new Thread(){}.start();這表示調(diào)用Thread子類對象的run方法,new Thread(){}表示一個Thread的匿名子類的實例對象,子類加上run方法后的代碼如下:new Thread(){ public void run(){ } }.start();第二種:new Thread(new Runnable(){}).start();這表示調(diào)用Thread對象接受的Runnable對象的run方法,new Runnable(){}表示一個Runnable的匿名子類的實例對象,runnable的子類加上run方法后的代碼如下:new Thread(new Runnable(){ public void run(){ } }).start(); 從java5開始,還有如下一些線程池創(chuàng)建多線程的方式:ExecutorService pool = Executors.newFixedThreadPool(3) for(int i=0;i<10;i++){ pool.execute(new Runable(){public void run(){}}); } Executors.newCachedThreadPool().execute(new Runable(){public void run(){}});Executors.newSingleThreadExecutor().execute(new Runable(){public void run(){}});前兩種實現(xiàn)方法,分別使用new Thread()和new Thread(runnable)形式,第一種直接調(diào)用thread的run方法,所以,我們往往使用Thread子類,即new SubThread()。第二種調(diào)用runnable的run方法。后兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable接口 用synchronized關(guān)鍵字修飾同步方法 反對使用stop(),是因為它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問題所在。suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時候,目標(biāo)線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復(fù)運(yùn)行。對任何線程來說,如果它們想恢復(fù)目標(biāo)線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應(yīng)該使用suspend(),而應(yīng)在自己的Thread類中置入一個標(biāo)志,指出線程應(yīng)該活動還是掛起。若標(biāo)志指出線程應(yīng)該掛起,便用wait()命其進(jìn)入等待狀態(tài)。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),則用一個notify()重新啟動線程。
java中線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系
一個程序中可以有多條執(zhí)行線索同時執(zhí)行,一個線程就是程序中的一條執(zhí)行線索,每個線程上都關(guān)聯(lián)有要執(zhí)行的代碼,即可以有多段程序代碼同時運(yùn)行,每個程序至少都有一個線程,即main方法執(zhí)行的那個線程。如果只是一個cpu,它怎么能夠同時執(zhí)行多段程序呢?這是從宏觀上來看的,cpu一會執(zhí)行a線索,一會執(zhí)行b線索,切換時間很快,給人的感覺是a,b在同時執(zhí)行,好比大家在同一個辦公室上網(wǎng),只有一條鏈接到外部網(wǎng)線,其實,這條網(wǎng)線一會為a傳數(shù)據(jù),一會為b傳數(shù)據(jù),由于切換時間很短暫,所以,大家感覺都在同時上網(wǎng)。 狀態(tài):就緒,運(yùn)行,synchronize阻塞,wait和sleep掛起,結(jié)束。wait必須在synchronized內(nèi)部調(diào)用。
調(diào)用線程的start方法后線程進(jìn)入就緒狀態(tài),線程調(diào)度系統(tǒng)將就緒狀態(tài)的線程轉(zhuǎn)為運(yùn)行狀態(tài),遇到synchronized語句時,由運(yùn)行狀態(tài)轉(zhuǎn)為阻塞,當(dāng)synchronized獲得鎖后,由阻塞轉(zhuǎn)為運(yùn)行,在這種情況可以調(diào)用wait方法轉(zhuǎn)為掛起狀態(tài),當(dāng)線程關(guān)聯(lián)的代碼執(zhí)行完后,線程變?yōu)榻Y(jié)束狀態(tài)。
當(dāng)一個線程進(jìn)入一個對象的一個synchronized方法后,其它線程是否可進(jìn)入此對象的其它方法? 分幾種情況:1.其他方法前是否加了synchronized關(guān)鍵字,如果沒加,則能。2.如果這個方法內(nèi)部調(diào)用了wait,則可以進(jìn)入其他synchronized方法。3.如果其他個方法都加了synchronized關(guān)鍵字,并且內(nèi)部沒有調(diào)用wait,則不能。4.如果其他方法是static,它用的同步鎖是當(dāng)前類的字節(jié)碼,與非靜態(tài)的方法不能同步,因為非靜態(tài)的方法用的是this。
java中多線程有幾種實現(xiàn)方法?同步有幾種實現(xiàn)方法?
多線程有兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable接口 同步的實現(xiàn)方面有兩種,分別是synchronized,wait與notify wait():使一個線程處于等待狀態(tài),并且釋放所持有的對象的lock。 sleep():使一個正在運(yùn)行的線程處于睡眠狀態(tài),是一個靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException異常。 notify():喚醒一個處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時候,并不能確切的喚醒某一個等待狀態(tài)的線程,而是由JVM確定喚醒哪個線程,而且不是按優(yōu)先級。 Allnotity():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。
【java單線程多線程的實現(xiàn)與方法】相關(guān)文章:
PHP實現(xiàn)多線程的方法09-01
java多線程08-31
java的多線程09-09
關(guān)于Java動態(tài)實現(xiàn)的方法08-23
java語言的多線程08-29
實現(xiàn)java屏幕抓屏的方法08-24
關(guān)于Java多線程介紹09-09
Java多線程的開發(fā)技巧10-16
Java多線程問題總結(jié)10-24
高級Java多線程面試題及回答06-08