Java多線(xiàn)程編程精要之高級(jí)支持
發(fā)表時(shí)間:2024-01-13 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]線(xiàn)程組 線(xiàn)程是被個(gè)別創(chuàng)建的,但可以將它們歸類(lèi)到線(xiàn)程組中,以便于調(diào)試和監(jiān)視。只能在創(chuàng)建線(xiàn)程的同時(shí)將它與一個(gè)線(xiàn)程組相關(guān)聯(lián)。在使用大量線(xiàn)程的程序中,使用線(xiàn)程組組織線(xiàn)程可能很有幫助。可以將它們看作是計(jì)算機(jī)上的目錄和文件結(jié)構(gòu)。 線(xiàn)程間發(fā)信 當(dāng)線(xiàn)程在繼續(xù)執(zhí)行前需要等待一個(gè)條件時(shí),僅有 synchr...
線(xiàn)程組
線(xiàn)程是被個(gè)別創(chuàng)建的,但可以將它們歸類(lèi)到線(xiàn)程組中,以便于調(diào)試和監(jiān)視。只能在創(chuàng)建線(xiàn)程的同時(shí)將它與一個(gè)線(xiàn)程組相關(guān)聯(lián)。在使用大量線(xiàn)程的程序中,使用線(xiàn)程組組織線(xiàn)程可能很有幫助。可以將它們看作是計(jì)算機(jī)上的目錄和文件結(jié)構(gòu)。
線(xiàn)程間發(fā)信
當(dāng)線(xiàn)程在繼續(xù)執(zhí)行前需要等待一個(gè)條件時(shí),僅有 synchronized 關(guān)鍵字是不夠的。雖然 synchronized 關(guān)鍵字阻止并發(fā)更新一個(gè)對(duì)象,但它沒(méi)有實(shí)現(xiàn)線(xiàn)程間發(fā)信。Object 類(lèi)為此提供了三個(gè)函數(shù):wait()、notify() 和 notifyAll()。以全球氣候預(yù)測(cè)程序?yàn)槔。這些程序通過(guò)將地球分為許多單元,在每個(gè)循環(huán)中,每個(gè)單元的計(jì)算都是隔離進(jìn)行的,直到這些值趨于穩(wěn)定,然后相鄰單元之間就會(huì)交換一些數(shù)據(jù)。所以,從本質(zhì)上講,在每個(gè)循環(huán)中各個(gè)線(xiàn)程都必須等待所有線(xiàn)程完成各自的任務(wù)以后才能進(jìn)入下一個(gè)循環(huán)。這個(gè)模型稱(chēng)為 屏蔽同步,下例說(shuō)明了這個(gè)模型:
屏蔽同步
數(shù) notify() 只通知一個(gè)正在等待的線(xiàn)程,當(dāng)對(duì)每次只能由一個(gè)線(xiàn)程使用的資源進(jìn)行訪(fǎng)問(wèn)限制時(shí),這個(gè)函數(shù)很有用。但是,不可能預(yù)知哪個(gè)線(xiàn)程會(huì)獲得這個(gè)通知,因?yàn)檫@取決于 Java 虛擬機(jī) (JVM) 調(diào)度算法。
將 CPU 讓給另一個(gè)線(xiàn)程
當(dāng)線(xiàn)程放棄某個(gè)稀有的資源(如數(shù)據(jù)庫(kù)連接或網(wǎng)絡(luò)端口)時(shí),它可能調(diào)用 yield() 函數(shù)臨時(shí)降低自己的優(yōu)先級(jí),以便某個(gè)其他線(xiàn)程能夠運(yùn)行。
守護(hù)線(xiàn)程
有兩類(lèi)線(xiàn)程:用戶(hù)線(xiàn)程和守護(hù)線(xiàn)程。用戶(hù)線(xiàn)程是那些完成有用工作的線(xiàn)程。 守護(hù)線(xiàn)程是那些僅提供輔助功能的線(xiàn)程。Thread 類(lèi)提供了 setDaemon() 函數(shù)。Java 程序?qū)⑦\(yùn)行到所有用戶(hù)線(xiàn)程終止,然后它將破壞所有的守護(hù)線(xiàn)程。在 Java 虛擬機(jī) (JVM) 中,即使在 main 結(jié)束以后,如果另一個(gè)用戶(hù)線(xiàn)程仍在運(yùn)行,則程序仍然可以繼續(xù)運(yùn)行。