java程序中如果有死循環(huán)運行一段時間后不會死掉,看情況的,如果沒有內(nèi)存了可能會死掉,看你的邏輯來。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、鎮(zhèn)平ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學管理、有技術(shù)的鎮(zhèn)平網(wǎng)站制作公司
有兩個線程在并發(fā)運行,一個線程執(zhí)行的代碼中含有一個死循環(huán)如:while(true)....當該線程在執(zhí)行while(true)中代碼時,另一個線程會有執(zhí)行。
一.示例代碼:
二.兩個線程類的實現(xiàn)如下:
三.線程A執(zhí)行methodA(),methodA()中有一個死循環(huán):
四.測試類:
由于線程A和線程B獲得的對象鎖不是同一把鎖,從結(jié)果中可以看出,線程B是可以執(zhí)行完成的。而線程A由于進入了while死循環(huán),故線程A一直執(zhí)行運行下去了(整個程序未結(jié)束),但線程B會結(jié)束。
也就是說,盡管線程A一直在while中執(zhí)行,需要占用CPU。但是,線程的調(diào)度是由JVM或者說是操作系統(tǒng)來負責的,并不是說線程A一直在while循環(huán),然后線程B就占用不到CPU了。對于線程A而言,相當于一個“計算密集型”作業(yè)了。如果while循環(huán)是不斷地測試某個條件是否成立,那么這種方式就很浪費CPU,可參考一個具體的實例:JAVA多線程之線程間的通信方式 中的“線程間的通信方式”第二點while輪詢。
如果把Service.java修改成如下:
總結(jié):若線程A先獲得對象鎖時,由于while循環(huán),線程A一直在while空循環(huán)中。而線程B也因為無法獲得鎖而執(zhí)行不了methodB()。
可以看出,如果在一個線程在synchronized方法中無法退出,無法將鎖釋放,另一個線程就只能無限等待了。
是這樣的,ss.accept()方法是阻塞的,也就是說ss所在的線程運行到accept()函數(shù)就會一直等待,直到ss接收到了一個Socket請求。正因為accept()是阻塞的,所以一般會把這個函數(shù)放在一個單獨的線程,這樣就不會影響主線程(例如程序界面)的運行,Socket編程幾乎是肯定和多線程編程一起用的。accept()放進了單獨的線程了自然就不會影響后面代碼的執(zhí)行,因為這時accept()的時間片和后續(xù)代碼的時間片會由JVM調(diào)配,而不是按照代碼編排的先后順序了。
另外你對死循環(huán)的理解有偏差,所謂死循環(huán)是指循環(huán)條件永遠為真而導致循環(huán)一直不結(jié)束,而由于循環(huán)內(nèi)部的方法阻塞導致的循環(huán)不結(jié)束不屬于死循環(huán),這兩個有本質(zhì)的差別。通常Socket.accept()是該放進一個死循環(huán)的,也就是你的while(true);