多線程知識點(diǎn)整理_第1頁
多線程知識點(diǎn)整理_第2頁
多線程知識點(diǎn)整理_第3頁
多線程知識點(diǎn)整理_第4頁
多線程知識點(diǎn)整理_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、基本概念多線程程序在較低的層次上擴(kuò)展了多任務(wù)的概念:一個(gè)程序同時(shí)執(zhí)行多個(gè)任務(wù),通常,每一個(gè)任務(wù)稱為一個(gè)線程,它是線程控制的簡稱。可以同時(shí)運(yùn)行一個(gè)以上線程的程序稱為多線程程序。多進(jìn)程與多線程的區(qū)別:每個(gè)進(jìn)程擁有自己的一整套變量,而線程則共享數(shù)據(jù)。相關(guān)接口Runnable 方法 void run()可由Runnable對象構(gòu)成Thread,不要調(diào)用Thread類或者Runable對象的run方法,直接調(diào)用run方法,只會執(zhí)行同一個(gè)線程中的任務(wù),而不會啟動新的線程。應(yīng)該調(diào)用Thread.start方法,這個(gè)方法將創(chuàng)建一個(gè)執(zhí)行run方法的新線程。Callable方法 V call() throws E

2、xception;與Runnable類似,但有返回值Future方法 V get() throwsV get(long timeout, TimeUnit unit) throws .Void cancle(boolean mayInterupt) /取消計(jì)算,如果已經(jīng)開始根據(jù)參數(shù)判斷是否中斷boolean isCacelled()boolean isDone() / 還在計(jì)算返回false,完成計(jì)算返回true保存異步計(jì)算的結(jié)果,可以啟動一個(gè)計(jì)算,將future對象交給某個(gè)線程,然后忘掉它,future對象的所有者在結(jié)果計(jì)算好之后就可以獲得它。第一個(gè)get方法的調(diào)用被阻塞,直到計(jì)算完成。如果

3、在計(jì)算完成之前,第二個(gè)方法的調(diào)用超時(shí),拋出一個(gè)timeoutException異常,如果運(yùn)行該計(jì)算的線程被中斷,兩個(gè)方法都將拋出interruptedException,如果計(jì)算已經(jīng)完成,那么get方法立即返回。FutureTask 包裝器是一種非常便利的機(jī)制,可將Callable轉(zhuǎn)換成future和Runnable,它同時(shí)實(shí)現(xiàn)二者的接口Callalbe myComputation = 。;FutureTask task = new FutureTask(myComputation );Thread t = new Thread(task);t.start();.V result = task

4、.get();線程的狀態(tài)要獲得一個(gè)線程的狀態(tài),調(diào)用getState方法新生:當(dāng)用new操作創(chuàng)建一個(gè)新線程時(shí),該線程還沒有開始運(yùn)行,這意味著它的狀態(tài)是新生。可運(yùn)行:一旦調(diào)用start方法,線程處于runnable狀態(tài),記住在任何時(shí)刻,一個(gè)可運(yùn)行的線程可能正在運(yùn)行也可能沒有運(yùn)行阻塞/等待/計(jì)時(shí)等待:當(dāng)線程處于被阻塞或等待狀態(tài)時(shí),它暫時(shí)不活動。它不運(yùn)行任何代碼且消耗最少的資源,直到線程調(diào)度器重新激活它。1.當(dāng)一個(gè)線程試圖獲取一個(gè)內(nèi)部的對象鎖,而該鎖被其他線程持有,則該線程進(jìn)入阻塞狀態(tài),當(dāng)所有其他線程釋放該鎖,并且線程調(diào)度器允許本線程持有它的時(shí)候,該線程將變成非阻塞狀態(tài)2.當(dāng)線程等待另一個(gè)線程通知調(diào)度

5、器一個(gè)條件時(shí),它自己進(jìn)入等待狀態(tài)。在調(diào)用object.wait方法或者thread.join方法,或者等待lock或condition時(shí)就會出現(xiàn)這種情況3.有幾個(gè)方法有一個(gè)超時(shí)參數(shù),調(diào)用它們導(dǎo)致線程進(jìn)入計(jì)時(shí)等待狀態(tài),這一狀態(tài)將一直保持到超時(shí)期滿,或者接收到適當(dāng)?shù)耐ㄖ?。終止:兩個(gè)原因?qū)е陆K止1.因?yàn)閞un方法正常退出而自然死亡 (當(dāng)線程的run方法執(zhí)行方法體中最后一條語句后,并經(jīng)由執(zhí)行return語句返回時(shí))2.因?yàn)橐粋€(gè)沒有捕獲的異常終止了run方法而意外死亡沒有一個(gè)狀態(tài)叫做中斷,中斷方法interrupt只是用來申請,當(dāng)調(diào)用該方法時(shí),線程的中斷狀態(tài)被置位。每個(gè)線程都應(yīng)該不時(shí)地檢查這個(gè)標(biāo)志,以判

6、斷線程是否被中斷。如果線程被阻塞,就無法檢測中斷狀態(tài)。當(dāng)一個(gè)被阻塞的線程(調(diào)用sleep或者wait)上調(diào)用interrupt方法時(shí),阻塞調(diào)用將會被InterruptedException異常中斷。被中斷的線程可以決定如何響應(yīng)中斷。如果在中斷狀態(tài)被置位時(shí)調(diào)用sleep方法,它不會休眠,相反,它將清除這一狀態(tài)并拋出InterruptedException。因此如果你的循環(huán)調(diào)用sleep,不會檢測中斷狀態(tài),應(yīng)捕獲InterruptException異常線程的屬性優(yōu)先級:每一個(gè)線程有一個(gè)優(yōu)先級,默認(rèn)情況下,一個(gè)線程繼承他的父線程的優(yōu)先級。每當(dāng)線程調(diào)度器有機(jī)會選擇新線程時(shí),它首先選擇具有較高優(yōu)先級的線

7、程。Yield 方法導(dǎo)致當(dāng)前執(zhí)行線程處于讓步狀態(tài),如果有其它的可運(yùn)行線程具有至少與此線程同樣高的優(yōu)先級,那么這些線程接下來會被調(diào)用。守護(hù)線程:setDaemon(true)可將線程轉(zhuǎn)換為守護(hù)線程。守護(hù)線程應(yīng)該永遠(yuǎn)不去訪問固定資源,如文件,數(shù)據(jù)庫,因?yàn)樗鼤谌魏螘r(shí)刻甚至在一個(gè)操作的中間發(fā)生中斷。同步鎖對象ReentrantLock結(jié)構(gòu): myLock.lock();try finally myLock.unlock(); .Lock myLock= new ReentrantLock();這一結(jié)構(gòu)確保任何時(shí)刻,只有一個(gè)線程進(jìn)入臨界區(qū),一旦一個(gè)線程封鎖鎖對象,其他任何線程都無法通過lock語句,當(dāng)

8、其他線程調(diào)用locka時(shí),它們被阻塞,直到第一個(gè)線程釋放鎖對象。鎖是可重入的,因?yàn)榫€程可以重復(fù)地獲得已經(jīng)持有的鎖,鎖保持一個(gè)持有計(jì)數(shù)來跟蹤對lock方法的嵌套調(diào)用,線程在每一次調(diào)用lock都要調(diào)用unlock來釋放鎖。條件對象結(jié)構(gòu):myLock.lock();trywhile(! Ok to proceed) myCondition.await(); /當(dāng)前線程被阻塞,并放棄了鎖,進(jìn)入該條件的等待集do thingsmyCondition.signalAll(); /解除因?yàn)檫@一條件而等待的所有線程,這些線程競爭后,被激活的線程從阻塞點(diǎn)開始執(zhí)行程序finally myLock.unlock()

9、; .Lock myLock= new ReentrantLock();Condition myCondition =myLock.newCondition();一個(gè)鎖對象可以有一個(gè)或多個(gè)相關(guān)的條件對象。synchronized關(guān)鍵字結(jié)構(gòu):public synchronized void method()while(! Ok to procee)wait();do thingsnotifyAll();Java中的每一個(gè)對象都一個(gè)內(nèi)部鎖,如果一個(gè)方法用synchronized 聲明,那么對象的鎖將保護(hù)整個(gè)方法,也就是說,要調(diào)用該方法,線程必須獲得內(nèi)部的對象鎖。內(nèi)部對象鎖只有一個(gè)相關(guān)條件,wait

10、方法放置一個(gè)線程到等待集中,nogifyAll方法解除等待線程的阻塞狀態(tài)相當(dāng)于condition中的await和signalAll將靜態(tài)方法聲明為synchronized 也是合法的,如果調(diào)用這種方法,該方法獲得相關(guān)類對象的內(nèi)部鎖,因此沒有其他線程可以調(diào)用同一個(gè)類的這個(gè)或任何其他的同步靜態(tài)方法。同步阻塞結(jié)構(gòu):synchronized(obj) 。Object obj = new Object();Volatile域結(jié)構(gòu): public boolean isDone()return done;public void setDone()done = true;private volatile bo

11、olean done;volatile關(guān)鍵字為實(shí)例域的同步訪問提供了一種免鎖機(jī)制,如果聲明一個(gè)域?yàn)関olatile,那么編譯器和虛擬機(jī)就知道該域是可能被另一個(gè)線程并發(fā)更新的。volatile變量不能提供原子性 例如:public void flipdone() done = !done ; /not atomic 不能確保改變域中的值在這樣一種非常簡單的情況下,可以使用java.util.concurrent.atomic中提供的包裝器類,用于原子的整數(shù),浮點(diǎn)數(shù),數(shù)組等。該類有g(shù)et和set方法,確保是原子的。該實(shí)現(xiàn)使用有效的機(jī)器指令,在不使用鎖的情況下確保原子性。鎖測試與超時(shí)tryLock試

12、圖申請一個(gè)鎖,在成功獲得鎖后返回true,否則立即返回false,而且線程可以立即離開做其他事情。調(diào)用tryLock時(shí)可使用超時(shí)參數(shù)。lock方法不能被中斷,如果出現(xiàn)死鎖,lock方法將無法終止。然而如果調(diào)用帶超時(shí)參數(shù)的tryLock,那么如果線程在等待期間被中斷,將拋出InterruptedException,將允許打破死鎖。lockInterruptlibly相當(dāng)于一個(gè)超時(shí)設(shè)為無限的tryLock方法在等待一個(gè)條件await時(shí),也可以設(shè)置超時(shí)讀/寫鎖ReentrantReadWriteLock結(jié)構(gòu): private ReentrantReadWriteLock rwl = new Reen

13、trantReadWriteLock ();private Lock readLock = rwl.readLock();private Lock writeLock = rwl.writeLock();readLock:得到一個(gè)可以被多個(gè)讀操作共用的讀鎖,但會排斥所有寫操作writeLock:得到一個(gè)寫鎖,排斥所有其他所有讀操作和寫操作。阻塞隊(duì)列對于許多線程問題,可以通過使用一個(gè)或多個(gè)隊(duì)列以優(yōu)雅的且安全的方式將其形式化。生產(chǎn)者線程向隊(duì)列插入元素,消費(fèi)者線程則取出它們。使用隊(duì)列,可以安全地從一個(gè)線程向另一個(gè)線程傳遞數(shù)據(jù)。在協(xié)調(diào)多個(gè)線程之間的合作時(shí),阻塞隊(duì)列是一個(gè)有用的工具。阻塞隊(duì)列的方法分為3

14、類:1.put和take:當(dāng)試圖向滿的隊(duì)列中體添加,或從空的隊(duì)列中移出元素時(shí),導(dǎo)致線程阻塞。用于將隊(duì)列當(dāng)做線程的管理工具來使用。2.add,remove和element,當(dāng)試圖向滿的隊(duì)列中體添加,或從空的隊(duì)列中移出元素時(shí)拋出異常。3.offer,poll和peek,當(dāng)試圖向滿的隊(duì)列中體添加,或從空的隊(duì)列中移出元素時(shí)如果不能完成任務(wù),只是給出一個(gè)錯(cuò)誤提示(返回null),而不會拋出異常。阻塞隊(duì)列的幾個(gè)變種:1.LinkedBlockingQueue : 沒有上邊界2.ArrayBlockingQueue :構(gòu)造時(shí)需要指定容量3.priorityBlockingQueue:是一個(gè)帶優(yōu)先級的隊(duì)列,而

15、不是先進(jìn)先出隊(duì)列4.DelayQueue:包含實(shí)現(xiàn)Delayed接口的對象線程安全的集合阻塞隊(duì)列也是線程安全的集合。其它集合:1.ConcurrentHashMap : 有相應(yīng)的方法用于原子性的關(guān)聯(lián)插入以及關(guān)聯(lián)刪除 (散列映像表)2.ConcurrentSkipListSet : 有序映像表3.ConcurrentLinkedQueue : 無邊界非阻塞隊(duì)列4.ConcurrentSkipListMap: 有相應(yīng)的方法用于原子性的關(guān)聯(lián)插入以及關(guān)聯(lián)刪除CopyOnWriteArrayList 和 copyOnWriteArraySet 是線程安全的集合。其中所有的修改線程對底層數(shù)組進(jìn)行復(fù)制。如果

16、在集合上進(jìn)行迭代的線程超過修改的線程數(shù),這樣的安排是很有用的。當(dāng)構(gòu)建一個(gè)迭代器的時(shí)候,它包含一個(gè)對當(dāng)前數(shù)組的引用,如果數(shù)組后來被修改了,迭代器仍然引用舊數(shù)組。Vector和HashTable是線程安全的,但后被棄用,取而代之的是ArrayList和HashMap,它們不是線程安全的。任何集合類通過使用同步包裝器變成線程安全的。List synchArrayList = Collections.synchronizedList(new ArrayList();Map SynchHashMap = Collections.synchronizedMap(new HashMap();結(jié)果集合的方法使

17、用鎖加以保護(hù),提供了線程的安全訪問。如果在另一個(gè)線程可能進(jìn)行修改時(shí),要對集合進(jìn)行迭代,仍需要使用同步阻塞,因?yàn)槿绻^程中,別的線程修改該集合,迭代器會失效,拋出ConcurrentModificationException。最好使用java.utile.concurrent中定義的集合,不使用同步包裝器,有一個(gè)例外經(jīng)常被修改的數(shù)組列表,在那種情況下,同步的arrayList可以勝過copyOnWriteArrayList.執(zhí)行器構(gòu)建一個(gè)新的線程是有一定代價(jià)的,因?yàn)樯婕芭c操作系統(tǒng)的交互。如果程序中創(chuàng)建了大量的生命周期很短的線程,應(yīng)該使用線程池。一個(gè)線程池中包含許多準(zhǔn)備運(yùn)行的空閑線程,將Run

18、nable對象交給線程池,就會有一個(gè)線程調(diào)用run方法。當(dāng)run方法退出時(shí),線程不會死亡,而是在池中準(zhǔn)備為下一個(gè)請求提供服務(wù)。執(zhí)行器(Executor)類有許多靜態(tài)工廠方法用來構(gòu)建線程池:1.newCachedThreadPool :對于每個(gè)任務(wù),如果有空閑線程可用,立即讓它執(zhí)行任務(wù),如果沒有則創(chuàng)建一個(gè)新線程。2.newFixedThreadPool :構(gòu)建一個(gè)具有固定大小的線程池,如果提交的任務(wù)數(shù)多于空閑的線程數(shù),那么把得不到服務(wù)的任務(wù)放置到隊(duì)列中。3.newSingleThreadExecutor:是一個(gè)退化了的大小為一個(gè)線程池,由一個(gè)線程執(zhí)行提交的任務(wù),一個(gè)接著一個(gè)。4.3個(gè)方法的返回值都是實(shí)現(xiàn)了ExecutorService接口的ThreadPoolExecutor類的對象。5.傳遞Runnable或者Callable對象的方法:i.Future submit(Runnable task)ii.Future submit(Runnable task,T result)iii.Future submit(Callable task)6.調(diào)用shutdown方法啟動線程池的關(guān)閉序列,被關(guān)閉的執(zhí)行器不再接受新的任務(wù),當(dāng)所有的任務(wù)都完成之后,線程池中的線程死亡。shutdownNow取消尚未開始的所有任務(wù)并試圖中

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論