資源描述:
《張孝祥多線(xiàn)程文檔》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、北京傳智播客教育www.itcast.cn傳統(tǒng)線(xiàn)程機(jī)制的回顧創(chuàng)建線(xiàn)程的兩種傳統(tǒng)方式在Thread子類(lèi)覆蓋的run方法中編寫(xiě)運(yùn)行代碼涉及一個(gè)以往知識(shí)點(diǎn):能否在run方法聲明上拋出InterruptedException異常,以便省略run方法內(nèi)部對(duì)Thread.sleep()語(yǔ)句的try…catch處理?在傳遞給Thread對(duì)象的Runnable對(duì)象的run方法中編寫(xiě)代碼總結(jié):查看Thread類(lèi)的run()方法的源代碼,可以看到其實(shí)這兩種方式都是在調(diào)用Thread對(duì)象的run方法,如果Thread類(lèi)的
2、run方法沒(méi)有被覆蓋,并且為該Thread對(duì)象設(shè)置了一個(gè)Runnable對(duì)象,該run方法會(huì)調(diào)用Runnable對(duì)象的run方法。問(wèn)題:如果在Thread子類(lèi)覆蓋的run方法中編寫(xiě)了運(yùn)行代碼,也為T(mén)hread子類(lèi)對(duì)象傳遞了一個(gè)Runnable對(duì)象,那么,線(xiàn)程運(yùn)行時(shí)的執(zhí)行代碼是子類(lèi)的run方法的代碼?還是Runnable對(duì)象的run方法的代碼?涉及到的一個(gè)以往知識(shí)點(diǎn):匿名內(nèi)部類(lèi)對(duì)象的構(gòu)造方法如何調(diào)用父類(lèi)的非默認(rèn)構(gòu)造方法。定時(shí)器的應(yīng)用Timer類(lèi)TimerTask類(lèi)北京傳智播客教育www.itcast.
3、cn線(xiàn)程的同步互斥與通信使用synchronized代碼塊及其原理使用synchronized方法分析靜態(tài)方法所使用的同步監(jiān)視器對(duì)象是什么?wait與notify實(shí)現(xiàn)線(xiàn)程間的通信北京傳智播客教育www.itcast.cn線(xiàn)程的同步互斥的圖文解說(shuō)北京傳智播客教育www.itcast.cn多個(gè)線(xiàn)程訪問(wèn)共享對(duì)象和數(shù)據(jù)的方式如果每個(gè)線(xiàn)程執(zhí)行的代碼相同,可以使用同一個(gè)Runnable對(duì)象,這個(gè)Runnable對(duì)象中有那個(gè)共享數(shù)據(jù),例如,買(mǎi)票系統(tǒng)就可以這么做。如果每個(gè)線(xiàn)程執(zhí)行的代碼不同,這時(shí)候需要用不同的Run
4、nable對(duì)象,有如下兩種方式來(lái)實(shí)現(xiàn)這些Runnable對(duì)象之間的數(shù)據(jù)共享:將共享數(shù)據(jù)封裝在另外一個(gè)對(duì)象中,然后將這個(gè)對(duì)象逐一傳遞給各個(gè)Runnable對(duì)象。每個(gè)線(xiàn)程對(duì)共享數(shù)據(jù)的操作方法也分配到那個(gè)對(duì)象身上去完成,這樣容易實(shí)現(xiàn)針對(duì)該數(shù)據(jù)進(jìn)行的各個(gè)操作的互斥和通信。將這些Runnable對(duì)象作為某一個(gè)類(lèi)中的內(nèi)部類(lèi),共享數(shù)據(jù)作為這個(gè)外部類(lèi)中的成員變量,每個(gè)線(xiàn)程對(duì)共享數(shù)據(jù)的操作方法也分配給外部類(lèi),以便實(shí)現(xiàn)對(duì)共享數(shù)據(jù)進(jìn)行的各個(gè)操作的互斥和通信,作為內(nèi)部類(lèi)的各個(gè)Runnable對(duì)象調(diào)用外部類(lèi)的這些方法。上面兩
5、種方式的組合:將共享數(shù)據(jù)封裝在另外一個(gè)對(duì)象中,每個(gè)線(xiàn)程對(duì)共享數(shù)據(jù)的操作方法也分配到那個(gè)對(duì)象身上去完成,對(duì)象作為這個(gè)外部類(lèi)中的成員變量或方法中的局部變量,每個(gè)線(xiàn)程的Runnable對(duì)象作為外部類(lèi)中的成員內(nèi)部類(lèi)或局部?jī)?nèi)部類(lèi)??傊?,要同步互斥的幾段代碼最好是分別放在幾個(gè)獨(dú)立的方法中,這些方法再放在同一個(gè)類(lèi)中,這樣比較容易實(shí)現(xiàn)它們之間的同步互斥和通信。極端且簡(jiǎn)單的方式,即在任意一個(gè)類(lèi)中定義一個(gè)static的變量,這將被所有線(xiàn)程共享。北京傳智播客教育www.itcast.cnThreadLocal實(shí)現(xiàn)線(xiàn)程范圍
6、的共享變量見(jiàn)下頁(yè)的示意圖和輔助代碼解釋ThreadLocal的作用和目的:用于實(shí)現(xiàn)線(xiàn)程內(nèi)的數(shù)據(jù)共享,即對(duì)于相同的程序代碼,多個(gè)模塊在同一個(gè)線(xiàn)程中運(yùn)行時(shí)要共享一份數(shù)據(jù),而在另外線(xiàn)程中運(yùn)行時(shí)又共享另外一份數(shù)據(jù)。每個(gè)線(xiàn)程調(diào)用全局ThreadLocal對(duì)象的set方法,就相當(dāng)于往其內(nèi)部的map中增加一條記錄,key分別是各自的線(xiàn)程,value是各自的set方法傳進(jìn)去的值。在線(xiàn)程結(jié)束時(shí)可以調(diào)用ThreadLocal.clear()方法,這樣會(huì)更快釋放內(nèi)存,不調(diào)用也可以,因?yàn)榫€(xiàn)程結(jié)束后也可以自動(dòng)釋放相關(guān)的Thr
7、eadLocal變量。ThreadLocal的應(yīng)用場(chǎng)景:訂單處理包含一系列操作:減少庫(kù)存量、增加一條流水臺(tái)賬、修改總賬,這幾個(gè)操作要在同一個(gè)事務(wù)中完成,通常也即同一個(gè)線(xiàn)程中進(jìn)行處理,如果累加公司應(yīng)收款的操作失敗了,則應(yīng)該把前面的操作回滾,否則,提交所有操作,這要求這些操作使用相同的數(shù)據(jù)庫(kù)連接對(duì)象,而這些操作的代碼分別位于不同的模塊類(lèi)中。銀行轉(zhuǎn)賬包含一系列操作:把轉(zhuǎn)出帳戶(hù)的余額減少,把轉(zhuǎn)入帳戶(hù)的余額增加,這兩個(gè)操作要在同一個(gè)事務(wù)中完成,它們必須使用相同的數(shù)據(jù)庫(kù)連接對(duì)象,轉(zhuǎn)入和轉(zhuǎn)出操作的代碼分別是兩個(gè)不
8、同的帳戶(hù)對(duì)象的方法。例如Strut2的ActionContext,同一段代碼被不同的線(xiàn)程調(diào)用運(yùn)行時(shí),該代碼操作的數(shù)據(jù)是每個(gè)線(xiàn)程各自的狀態(tài)和數(shù)據(jù),對(duì)于不同的線(xiàn)程來(lái)說(shuō),getContext方法拿到的對(duì)象都不相同,對(duì)同一個(gè)線(xiàn)程來(lái)說(shuō),不管調(diào)用getContext方法多少次和在哪個(gè)模塊中g(shù)etContext方法,拿到的都是同一個(gè)。實(shí)驗(yàn)案例:定義一個(gè)全局共享的ThreadLocal變量,然后啟動(dòng)多個(gè)線(xiàn)程向該ThreadLocal變量中存儲(chǔ)一個(gè)隨機(jī)值,接著各個(gè)線(xiàn)程調(diào)用另外其他多個(gè)類(lèi)