Java程序設(shè)計(jì)第8章 多線(xiàn)程_第1頁(yè)
Java程序設(shè)計(jì)第8章 多線(xiàn)程_第2頁(yè)
Java程序設(shè)計(jì)第8章 多線(xiàn)程_第3頁(yè)
Java程序設(shè)計(jì)第8章 多線(xiàn)程_第4頁(yè)
Java程序設(shè)計(jì)第8章 多線(xiàn)程_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Java程序設(shè)計(jì)第8章多線(xiàn)程8.1線(xiàn)程及其創(chuàng)建8.1.1Java中的線(xiàn)程Java程序通過(guò)流控制來(lái)執(zhí)行程序流,程序中單個(gè)順序的流控制稱(chēng)為線(xiàn)程,多線(xiàn)程則指的是在單個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線(xiàn)程執(zhí)行不同的任務(wù)。在操作系統(tǒng)的任務(wù)管理器中可以查看線(xiàn)程數(shù)在任務(wù)管理器的標(biāo)題欄上,右鍵,選擇列,選中“線(xiàn)程數(shù)”很多程序語(yǔ)言需要利用外部的線(xiàn)程軟件包來(lái)實(shí)現(xiàn)多線(xiàn)程,而Java則內(nèi)在支持多線(xiàn)程,它的所有類(lèi)都是在多線(xiàn)程的思想下定義的。線(xiàn)程線(xiàn)程就是程序中單獨(dú)順序的流控制。Java的線(xiàn)程是通過(guò)Java的軟件包java.lang中定義的類(lèi)Thread來(lái)實(shí)現(xiàn)的。線(xiàn)程體線(xiàn)程的所有活動(dòng)都是通過(guò)線(xiàn)程體----run()方法來(lái)實(shí)現(xiàn)的。在一個(gè)線(xiàn)程被建立并初始化以后,Java的運(yùn)行時(shí)系統(tǒng)就自動(dòng)調(diào)用run()方法。正是通過(guò)run()方法才使得建立線(xiàn)程的目的得以實(shí)現(xiàn)。通常,run()方法是一個(gè)循環(huán),例如一個(gè)播放動(dòng)畫(huà)的線(xiàn)程要循環(huán)顯示一系列圖片。有時(shí),run()方法會(huì)執(zhí)行一個(gè)時(shí)間較長(zhǎng)的操作,例如下載并播放一個(gè)JPEG格式的電影。8.1.2創(chuàng)建線(xiàn)程對(duì)象的兩種方法1.通過(guò)繼承Thread類(lèi)創(chuàng)建線(xiàn)程classMyThreadextendsThread{ publicvoidrun(){ for(inti=0;i<100;i++){ System.out.print(""+i); } }2.通過(guò)向Thread()構(gòu)造方法傳遞Runnable對(duì)象來(lái)創(chuàng)建線(xiàn)程classMyTaskimplementsRunnable{publicvoidrun(){…}}Threadthread=newThread(mytask);thread.start();3.可用匿名類(lèi)來(lái)實(shí)現(xiàn)Runnable,如TestThread4Anonymous.java8.1.3多線(xiàn)程TestThread3.java多線(xiàn)程。

ThreadDraw.java多線(xiàn)程繪圖。8.2線(xiàn)程的控制8.2.1線(xiàn)程的狀態(tài)與生命周期在一個(gè)線(xiàn)程的生命周期中,它總處于某一種狀態(tài)中。線(xiàn)程的狀態(tài)表示了線(xiàn)程正在進(jìn)行的活動(dòng)以及在這段時(shí)間內(nèi)線(xiàn)程能完成的任務(wù)。8.2.2線(xiàn)程優(yōu)先級(jí)Thread類(lèi)有三個(gè)有關(guān)線(xiàn)程優(yōu)先級(jí)的靜態(tài)常量:MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY8.2.3對(duì)線(xiàn)程的基本控制結(jié)束線(xiàn)程由于線(xiàn)程中一般是一個(gè)多次或無(wú)限次數(shù)的循環(huán),現(xiàn)在一般采取給線(xiàn)程設(shè)定一個(gè)標(biāo)記變量的方法來(lái)決定線(xiàn)程是否應(yīng)該終止。設(shè)定線(xiàn)程的優(yōu)先級(jí)可以使用Thread對(duì)象的setPriority(intpriority)方法線(xiàn)程的啟動(dòng):start()暫時(shí)阻止線(xiàn)程的執(zhí)行Thread.sleep(longmillisecond)來(lái)掛起線(xiàn)程的執(zhí)行try{ Thread.sleep(1000); }catch(InterruptedExceptione){ //…. }join()方法。調(diào)用某Thread對(duì)象的join()方法,可以將一個(gè)線(xiàn)程加入到本線(xiàn)程中,本線(xiàn)程的執(zhí)行會(huì)等待另一線(xiàn)程執(zhí)行完畢。Threadt;//t是另一線(xiàn)程try{ t.join(); }catch(InterruptedExceptione){ //…. }

后臺(tái)線(xiàn)程線(xiàn)程有兩種,一類(lèi)是Daemon線(xiàn)程,一類(lèi)是非Daemon線(xiàn)程。在Java程序中,若還有非Demon線(xiàn)程,則整個(gè)程序就不會(huì)結(jié)束;當(dāng)正在運(yùn)行的線(xiàn)程都是守護(hù)線(xiàn)程時(shí),Java虛擬機(jī)退出。使用setDaemon(true);注:垃圾回收線(xiàn)程是后臺(tái)線(xiàn)程示例:TestThreadDaemon.java8.3

線(xiàn)程的同步線(xiàn)程的不確定性示例TestThreadCount.java注n++實(shí)際編譯為多線(xiàn)程同步線(xiàn)程都是獨(dú)立的,而且異步執(zhí)行,也就是說(shuō)每個(gè)線(xiàn)程都包含了運(yùn)行時(shí)所需要的數(shù)據(jù)或方法,而不需要外部的資源或方法,也不必關(guān)心其它線(xiàn)程的狀態(tài)或行為。但是經(jīng)常有一些同時(shí)運(yùn)行的線(xiàn)程需要共享數(shù)據(jù),例如一個(gè)線(xiàn)程向文件寫(xiě)數(shù)據(jù),而同時(shí)另一個(gè)線(xiàn)程從同一文件中讀取數(shù)據(jù),因此就必須考慮其它線(xiàn)程的狀態(tài)與行為,這時(shí)就需要實(shí)現(xiàn)同步來(lái)得到預(yù)期結(jié)果。示例:SyncCounter1.java在Java語(yǔ)言中,引入了對(duì)象互斥鎖的概念,來(lái)保證共享數(shù)據(jù)操作的完整性。每個(gè)對(duì)象都對(duì)應(yīng)于一個(gè)可稱(chēng)為“互斥鎖”的標(biāo)記,這個(gè)標(biāo)記用來(lái)保證在任一時(shí)刻,只能有一個(gè)線(xiàn)程訪(fǎng)問(wèn)該對(duì)象。關(guān)鍵字synchronized用來(lái)與對(duì)象的互斥鎖聯(lián)系。當(dāng)某個(gè)對(duì)象用synchronized修飾時(shí),表明該對(duì)象在任一時(shí)刻只能由一個(gè)線(xiàn)程訪(fǎng)問(wèn)。使用wait()方法可以釋放對(duì)象鎖使用notify()或notifyAll()可以讓等待的一個(gè)或所有線(xiàn)程進(jìn)入就緒狀態(tài)synchronized除了象上面講的放在對(duì)象前面限制一段代碼的執(zhí)行外,還可以放在方法聲明中,表示整個(gè)方法為同步方法。publicsynchronizedvoidpush(charc){… }如果synchronized用在類(lèi)聲明中,則表明該類(lèi)中的所有方法都是synchronized的。示例:SyncCounter2.java生產(chǎn)者-消費(fèi)者問(wèn)題 示例:ProducerConsumerStack.java classCubbyHole{ privateintindex=0; privateint[]data=newint[3];

publicsynchronizedvoidput(intvalue){ while(index==data.length){ try{ this.wait(); }catch(InterruptedExceptione){} } data[index]=value; index++;

this.notify();}publicsynchronizedintget(){ while(index<=0){ try{ this.wait(); }catch(InterruptedExceptione){} } index--; intval=data[index];

this.notify();returnval;} }線(xiàn)程的死鎖示例DeadLock.javaDeadLockDemo.java8.4并發(fā)API從Java5開(kāi)始java.util.concurrent包及其子包(并發(fā)?并行?)并行的集合類(lèi)ArrayList/HashMap不是線(xiàn)程安全的Vector及Hashtable是線(xiàn)程安全的java.util.concurrent包產(chǎn)生一個(gè)線(xiàn)程安全的集合對(duì)象Collections.synchronizedArrayList(list)CopyOnWriteArrayList、CopyOnWriteArraySet適合于很少寫(xiě)入而讀取頻繁的對(duì)象ArrayBlockingQueue生產(chǎn)者與消費(fèi)者,使用put()及take()ConcurrentHashMapputIfAbsent(),remove(),replace()顯式鎖java.util.concurrent.locks包Lock接口、ReentrantLock類(lèi)lock()tryLock()unlock()例:NoDeadLockDemo.javaReadWriteLock接口、ReentrantReadWriteLock類(lèi).writeLock().lock(),.readLock().unlock()例:ArrayList2.java原子變量java.util.concurrent.atomic

包示

溫馨提示

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

評(píng)論

0/150

提交評(píng)論