張孝祥多線程文檔_第1頁
張孝祥多線程文檔_第2頁
張孝祥多線程文檔_第3頁
張孝祥多線程文檔_第4頁
張孝祥多線程文檔_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、北京傳智播客教育 傳統(tǒng)線程機(jī)制的回顧創(chuàng)建線程的兩種傳統(tǒng)方式在Thread子類覆蓋的run方法中編寫運行代碼涉及一個以往知識點:能否在run方法聲明上拋出InterruptedException異常,以便省略run方法內(nèi)部對Thread.sleep()語句的trycatch處理?在傳遞給Thread對象的Runnable對象的run方法中編寫代碼總結(jié):查看Thread類的run()方法的源代碼,可以看到其實這兩種方式都是在調(diào)用Thread對象的run方法,如果Thread類的run方法沒有被覆蓋,并且為該Thread對象設(shè)置了一個Runnable對象,該run方法會調(diào)用Runnable對象的ru

2、n方法。問題:如果在Thread子類覆蓋的run方法中編寫了運行代碼,也為Thread子類對象傳遞了一個Runnable對象,那么,線程運行時的執(zhí)行代碼是子類的run方法的代碼?還是Runnable對象的run方法的代碼?涉及到的一個以往知識點:匿名內(nèi)部類對象的構(gòu)造方法如何調(diào)用父類的非默認(rèn)構(gòu)造方法。定時器的應(yīng)用Timer類TimerTask類1北京傳智播客教育 線程的同步互斥與通信使用synchronized代碼塊及其原理使用synchronized方法分析靜態(tài)方法所使用的同步監(jiān)視器對象是什么?wait與notify實現(xiàn)線程間的通信2北京傳智播客教育 線程的同步互斥的圖文解說3北京傳智播客教育

3、 多個線程訪問共享對象和數(shù)據(jù)的方式如果每個線程執(zhí)行的代碼相同,可以使用同一個Runnable對象,這個Runnable對象中有那個共享數(shù)據(jù),例如,買票系統(tǒng)就可以這么做。如果每個線程執(zhí)行的代碼不同,這時候需要用不同的Runnable對象,有如下兩種方式來實現(xiàn)這些Runnable對象之間的數(shù)據(jù)共享:將共享數(shù)據(jù)封裝在另外一個對象中,然后將這個對象逐一傳遞給各個Runnable對象。每個線程對共享數(shù)據(jù)的操作方法也分配到那個對象身上去完成,這樣容易實現(xiàn)針對該數(shù)據(jù)進(jìn)行的各個操作的互斥和通信。將這些Runnable對象作為某一個類中的內(nèi)部類,共享數(shù)據(jù)作為這個外部類中的成員變量,每個線程對共享數(shù)據(jù)的操作方法也

4、分配給外部類,以便實現(xiàn)對共享數(shù)據(jù)進(jìn)行的各個操作的互斥和通信,作為內(nèi)部類的各個Runnable對象調(diào)用外部類的這些方法。上面兩種方式的組合:將共享數(shù)據(jù)封裝在另外一個對象中,每個線程對共享數(shù)據(jù)的操作方法也分配到那個對象身上去完成,對象作為這個外部類中的成員變量或方法中的局部變量,每個線程的Runnable對象作為外部類中的成員內(nèi)部類或局部內(nèi)部類??傊交コ獾膸锥未a最好是分別放在幾個獨立的方法中,這些方法再放在同一個類中,這樣比較容易實現(xiàn)它們之間的同步互斥和通信。極端且簡單的方式,即在任意一個類中定義一個static的變量,這將被所有線程共享。4北京傳智播客教育 ThreadLocal實現(xiàn)線

5、程范圍的共享變量見下頁的示意圖和輔助代碼解釋ThreadLocal的作用和目的:用于實現(xiàn)線程內(nèi)的數(shù)據(jù)共享,即對于相同的程序代碼,多個模塊在同一個線程中運行時要共享一份數(shù)據(jù),而在另外線程中運行時又共享另外一份數(shù)據(jù)。每個線程調(diào)用全局ThreadLocal對象的set方法,就相當(dāng)于往其內(nèi)部的map中增加一條記錄,key分別是各自的線程,value是各自的set方法傳進(jìn)去的值。在線程結(jié)束時可以調(diào)用ThreadLocal.clear()方法,這樣會更快釋放內(nèi)存,不調(diào)用也可以,因為線程結(jié)束后也可以自動釋放相關(guān)的ThreadLocal變量。ThreadLocal的應(yīng)用場景:訂單處理包含一系列操作:減少庫存量

6、、增加一條流水臺賬、修改總賬,這幾個操作要在同一個事務(wù)中完成,通常也即同一個線程中進(jìn)行處理,如果累加公司應(yīng)收款的操作失敗了,則應(yīng)該把前面的操作回滾,否則,提交所有操作,這要求這些操作使用相同的數(shù)據(jù)庫連接對象,而這些操作的代碼分別位于不同的模塊類中。 銀行轉(zhuǎn)賬包含一系列操作: 把轉(zhuǎn)出帳戶的余額減少,把轉(zhuǎn)入帳戶的余額增加,這兩個操作要在同一個事務(wù)中完成,它們必須使用相同的數(shù)據(jù)庫連接對象,轉(zhuǎn)入和轉(zhuǎn)出操作的代碼分別是兩個不同的帳戶對象的方法。例如Strut2的ActionContext,同一段代碼被不同的線程調(diào)用運行時,該代碼操作的數(shù)據(jù)是每個線程各自的狀態(tài)和數(shù)據(jù),對于不同的線程來說,getContex

7、t方法拿到的對象都不相同,對同一個線程來說,不管調(diào)用getContext方法多少次和在哪個模塊中g(shù)etContext方法,拿到的都是同一個。實驗案例:定義一個全局共享的ThreadLocal變量,然后啟動多個線程向該ThreadLocal變量中存儲一個隨機(jī)值,接著各個線程調(diào)用另外其他多個類的方法,這多個類的方法中讀取這個ThreadLocal變量的值,就可以看到多個類在同一個線程中共享同一份數(shù)據(jù)。實現(xiàn)對ThreadLocal變量的封裝,讓外界不要直接操作ThreadLocal變量。對基本類型的數(shù)據(jù)的封裝,這種應(yīng)用相對很少見。對對象類型的數(shù)據(jù)的封裝,比較常見,即讓某個類針對不同線程分別創(chuàng)建一個獨

8、立的實例對象。5北京傳智播客教育 線程范圍內(nèi)共享數(shù)據(jù)的示意圖變量或表達(dá)式對象與模塊A變量或表達(dá)式對象與模塊B變量或表達(dá)式對象與模塊C線程1線程2線程1 綁定的數(shù)據(jù)線程2 綁定的數(shù)據(jù)6北京傳智播客教育 Java5中的線程并發(fā)庫看java.util.concurrent包及子包的API幫助文檔了解java.util.concurrent.atomic包查看atomic包文檔頁下面的介紹通過如下兩個方法快速理解atomic包的意義:AtomicInteger類的boolean compareAndSet(expectedValue, updateValue); AtomicIntegerArray類

9、的int addAndGet(inti, intdelta);順帶解釋volatile類型的作用,需要查看java語言規(guī)范。了解java.util.concurrent.lock包在下頁通過案例詳細(xì)講解7北京傳智播客教育 線程池線程池的概念與Executors類的應(yīng)用創(chuàng)建固定大小的線程池創(chuàng)建緩存線程池創(chuàng)建單一線程池關(guān)閉線程池shutdown與shutdownNow的比較用線程池啟動定時器調(diào)用ScheduledExecutorService的schedule方法,返回的ScheduleFuture對象可以取消任務(wù)。支持間隔重復(fù)任務(wù)的定時方式,不直接支持絕對定時方式,需要轉(zhuǎn)換成相對時間方式。8北京

10、傳智播客教育 Callable&FutureFuture取得的結(jié)果類型和Callable返回的結(jié)果類型必須一致,這是通過泛型來實現(xiàn)的。Callable要采用ExecutorSevice的submit方法提交,返回的future對象可以取消任務(wù)。CompletionService用于提交一組Callable任務(wù),其take方法返回已完成的一個Callable任務(wù)對應(yīng)的Future對象。好比我同時種了幾塊地的麥子,然后就等待收割。收割時,則是那塊先成熟了,則先去收割哪塊麥子。9北京傳智播客教育 Lock&Condition實現(xiàn)線程同步通信Lock比傳統(tǒng)線程模型中的synchronized方式更加面

11、向?qū)ο螅c生活中的鎖類似,鎖本身也應(yīng)該是一個對象。兩個線程執(zhí)行的代碼片段要實現(xiàn)同步互斥的效果,它們必須用同一個Lock對象。讀寫鎖:分為讀鎖和寫鎖,多個讀鎖不互斥,讀鎖與寫鎖互斥,這是由jvm自己控制的,你只要上好相應(yīng)的鎖即可。如果你的代碼只讀數(shù)據(jù),可以很多人同時讀,但不能同時寫,那就上讀鎖;如果你的代碼修改數(shù)據(jù),只能有一個人在寫,且不能同時讀取,那就上寫鎖。總之,讀的時候上讀鎖,寫的時候上寫鎖!在等待 Condition 時,允許發(fā)生“虛假喚醒”,這通常作為對基礎(chǔ)平臺語義的讓步。對于大多數(shù)應(yīng)用程序,這帶來的實際影響很小,因為 Condition 應(yīng)該總是在一個循環(huán)中被等待,并測試正被等待的狀

12、態(tài)聲明。某個實現(xiàn)可以隨意移除可能的虛假喚醒,但建議應(yīng)用程序程序員總是假定這些虛假喚醒可能發(fā)生,因此總是在一個循環(huán)中等待。一個鎖內(nèi)部可以有多個Condition,即有多路等待和通知,可以參看jdk1.5提供的Lock與Condition實現(xiàn)的可阻塞隊列的應(yīng)用案例,從中除了要體味算法,還要體味面向?qū)ο蟮姆庋b。在傳統(tǒng)的線程機(jī)制中一個監(jiān)視器對象上只能有一路等待和通知,要想實現(xiàn)多路等待和通知,必須嵌套使用多個同步監(jiān)視器對象。(如果只用一個Condition,兩個放的都在等,一旦一個放的進(jìn)去了,那么它通知可能會導(dǎo)致另一個放接著往下走。)10北京傳智播客教育 Semaphore實現(xiàn)信號燈Semaphore可

13、以維護(hù)當(dāng)前訪問自身的線程個數(shù),并提供了同步機(jī)制。使用Semaphore可以控制同時訪問資源的線程個數(shù),例如,實現(xiàn)一個文件允許的并發(fā)訪問數(shù)。Semaphore實現(xiàn)的功能就類似廁所有5個坑,假如有十個人要上廁所,那么同時能有多少個人去上廁所呢?同時只能有5個人能夠占用,當(dāng)5個人中的任何一個人讓開后,其中在等待的另外5個人中又有一個可以占用了。另外等待的5個人中可以是隨機(jī)獲得優(yōu)先機(jī)會,也可以是按照先來后到的順序獲得機(jī)會,這取決于構(gòu)造Semaphore對象時傳入的參數(shù)選項。單個信號量的Semaphore對象可以實現(xiàn)互斥鎖的功能,并且可以是由一個線程獲得了“鎖”,再由另一個線程釋放“鎖”,這可應(yīng)用于死鎖

14、恢復(fù)的一些場合。11北京傳智播客教育 其他同步工具類CyclicBarrier表示大家彼此等待,大家集合好后才開始出發(fā),分散活動后又在指定地點集合碰面,這就好比整個公司的人員利用周末時間集體郊游一樣,先各自從家出發(fā)到公司集合后,再同時出發(fā)到公園游玩,在指定地點集合后再同時開始就餐,。CountDownLatch猶如倒計時計數(shù)器,調(diào)用CountDownLatch對象的countDown方法就將計數(shù)器減1,當(dāng)計數(shù)到達(dá)0時,則所有等待者或單個等待者開始執(zhí)行。這直接通過代碼來說明CountDownLatch的作用,這樣學(xué)員的理解效果更直接??梢詫崿F(xiàn)一個人(也可以是多個人)等待其他所有人都來通知他,這猶

15、如一個計劃需要多個領(lǐng)導(dǎo)都簽字后才能繼續(xù)向下實施。還可以實現(xiàn)一個人通知多個人的效果,類似裁判一聲口令,運動員同時開始奔跑。用這個功能做百米賽跑的游戲程序不錯哦!Exchanger用于實現(xiàn)兩個人之間的數(shù)據(jù)交換,每個人在完成一定的事務(wù)后想與對方交換數(shù)據(jù),第一個先拿出數(shù)據(jù)的人將一直等待第二個人拿著數(shù)據(jù)到來時,才能彼此交換數(shù)據(jù)。12北京傳智播客教育 可阻塞的隊列什么是可阻塞隊列,阻塞隊列的作用與實際應(yīng)用,阻塞隊列的實現(xiàn)原理。阻塞隊列與Semaphore有些相似,但也不同,阻塞隊列是一方存放數(shù)據(jù),另一方釋放數(shù)據(jù),Semaphore通常則是由同一方設(shè)置和釋放信號量。ArrayBlockingQueue只有put方法和take方法才具有阻塞功能用3個空間的隊列來演示阻塞隊列的功能和效果。用兩個具有1個空間的隊列來實現(xiàn)同步通知的功能。13北京傳智播客教育 同步集合傳統(tǒng)集合類在并發(fā)訪問時的問題說明,見附件傳統(tǒng)方式下用Collections工具類提供的synchronizedCollection方法來獲得同步集合,分析該方法的實現(xiàn)源碼。傳統(tǒng)方式下的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論