Java面向?qū)ο蟪绦蛟O(shè)計(jì)-課件 第8章 多線程_第1頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)-課件 第8章 多線程_第2頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)-課件 第8章 多線程_第3頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)-課件 第8章 多線程_第4頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)-課件 第8章 多線程_第5頁(yè)
已閱讀5頁(yè),還剩16頁(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)介

1Java多線程2概述線程的創(chuàng)建兩種方式線程的同步synchronizedwait()/notifyAll()/notify()線程的生命周期3概述進(jìn)程(Process)程序(Program)的一次動(dòng)態(tài)執(zhí)行過(guò)程,占用特定的地址空間在某種程度上相互隔離的、獨(dú)立運(yùn)行的程序多任務(wù)(Multitasking)操作系統(tǒng)將CPU時(shí)間動(dòng)態(tài)地劃分給每個(gè)進(jìn)程,操作系統(tǒng)同時(shí)執(zhí)行多個(gè)進(jìn)程,每個(gè)進(jìn)程獨(dú)立運(yùn)行進(jìn)程的查看Windows系統(tǒng):Ctrl+Alt+DelUnix系統(tǒng):psortop4線程(Thread)線程是進(jìn)程中一個(gè)“單一的連續(xù)控制流程”一個(gè)進(jìn)程可擁有多個(gè)并行的線程一個(gè)進(jìn)程中的線程共享相同的內(nèi)存單元/內(nèi)存地址空間可以訪問(wèn)相同的變量和對(duì)象,而且它們從同一堆中分配對(duì)象通信、數(shù)據(jù)交換、同步操作輕量級(jí)進(jìn)程(lightweightprocess)單線程程序多線程程序一個(gè)線程兩個(gè)線程6Java語(yǔ)言中的線程大多數(shù)現(xiàn)代的操作系統(tǒng)都支持線程Java是第一個(gè)在語(yǔ)言本身中顯性地包含線程的主流編程語(yǔ)言,它沒(méi)有把線程化看作是底層操作系統(tǒng)的工具每個(gè)Java程序都至少有一個(gè)線程—主線程當(dāng)一個(gè)Java程序啟動(dòng)時(shí),JVM會(huì)創(chuàng)建主線程,并在該線程中調(diào)用程序的main()方法JVM還創(chuàng)建了其它線程,如垃圾收集(gc)7Java實(shí)現(xiàn)多線程的方法java.lang.Thread類(lèi)java.lang.Runnable接口多線程的用途Client/Server設(shè)計(jì)中的服務(wù)器端,如每個(gè)用戶(hù)請(qǐng)求建立一個(gè)線程圖形用戶(hù)界面(GUI)的設(shè)計(jì)中提高事件響應(yīng)的靈敏度從提高程序執(zhí)行效率的考慮利用多處理器系統(tǒng)執(zhí)行異步或后臺(tái)處理等8初探線程publicclassSimpleThreadextendsThread{publicSimpleThread(Stringstr){super(str);}publicvoidrun()

{

System.out.println(getName()+“線程開(kāi)始!");for(inti=0;i<8;i++){System.out.println(i+""+getName());try{sleep((long)(Math.random()*1000));}catch(InterruptedExceptione){}}

System.out.println(getName()+"線程運(yùn)行結(jié)束!");}}概述publicclassTwoThreadsDemo{publicstaticvoidmain(String[]args){

newSimpleThread(“A").start();

newSimpleThread(“B").start();}}9線程創(chuàng)建的兩種方式繼承java.lang.Thread類(lèi),重寫(xiě)run()方法實(shí)現(xiàn)java.lang.Runnable接口Runnable接口的唯一方法publicvoidrun()線程的創(chuàng)建10線程的創(chuàng)建publicclassTwoThreadsDemo{publicstaticvoidmain(String[]args){

newSimpleThread1("Jamaica").start();

newSimpleThread1("Fiji").start();}}publicclassSimpleThread2

implementsRunnable{Stringname;publicSimpleThread2(Stringstr){name=str;}publicvoidrun(){for(inti=0;i<8;i++){System.out.println(i+""+name);Thread.sleep((long)(Math.random()*1000));}catch(InterruptedExceptione){}}System.out.println("DONE!"+name);}}publicclassSimpleThread1

extendsThread{publicSimpleThread1(Stringstr){super(str);}publicvoidrun(){for(inti=0;i<8;i++){System.out.println(i+""+getName());try{

sleep((long)(Math.random()*1000));}catch(InterruptedExceptione){}}System.out.println("DONE!"+getName());}}publicclassTwoThreadsDemo{publicstaticvoidmain(String[]args){SimpleThread2a=newSimpleThread2("Jack");

Threadthread1=newThread(a); thread1.start(); SimpleThread2b=newSimpleThread2(“Tom");Threadthread2=newThread(b);thread2.start();}}11共享資源的訪問(wèn)多個(gè)線程對(duì)同一資源進(jìn)行操作(讀/寫(xiě))當(dāng)多個(gè)線程訪問(wèn)同一數(shù)據(jù)項(xiàng)(如靜態(tài)字段、可全局訪問(wèn)對(duì)象的實(shí)例字段或共享集合)時(shí),需要確保它們協(xié)調(diào)了對(duì)數(shù)據(jù)的訪問(wèn),這樣它們都可以看到數(shù)據(jù)的一致視圖,而且相互不會(huì)干擾另一方的更改synchronized關(guān)鍵詞wait()/notify()/notifyAll()方法線程的同步12線程的同步publicclassCubbyHole{

privateintcontents;publicintget(){returncontents;}publicvoidput(intvalue){contents=value;}}publicclassProducerextendsThread{privateCubbyHolecubbyhole;publicProducer(CubbyHolec){cubbyhole=c;}publicvoidrun(){for(inti=0;i<10;i++){cubbyhole.put(i);System.out.println(“生產(chǎn)了:"+i);try{sleep((int)(Math.random()*100));}catch(InterruptedExceptione){}}}}publicclassConsumerextendsThread{privateCubbyHolecubbyhole;publicConsumer(CubbyHolec){cubbyhole=c;}publicvoidrun(){intvalue=0;for(inti=0;i<10;i++){value=cubbyhole.get();System.out.println(“消費(fèi)了:"+value);}}}publicclassProducerConsumerTest{publicstaticvoidmain(String[]args){CubbyHoleh=newCubbyHole();Producerp=newProducer(h);Consumerc=newConsumer(h);p.start();c.start();}}13給關(guān)鍵部分(CriticalSection)加鎖(lock)CubbyHole對(duì)象synchronized關(guān)鍵詞

thetwothreadsmustnotsimultaneouslyaccesstheCubbyHole.publicclassCubbyHole{privateintcontents;publicintget(){returncontents;}publicvoidput(intvalue){contents=value;}}publicclassCubbyHole{privateintcontents;publicsynchronizedintget(){returncontents;}publicsynchronizedvoidput(intvalue){contents=value;}}14線程的協(xié)調(diào)thetwothreadsmustdosomesimplecoordination.Producer通過(guò)某種方式告訴Consumer在CubbyHole中有值,而Consumer必須通過(guò)某種方式表示出CubbyHole中的值已被取走CubbyHole對(duì)象(CriticalSection)java.lang.Object類(lèi)的方法wait()、notify()、notifyAll()15線程的同步publicclassCubbyHole{privateintcontents;publicintget(){returncontents;}publicvoidput(intvalue){contents=value;}}publicclassCubbyHole{privateintcontents;privatebooleanavailable=false;publicsynchronizedintget(){while(available==false){try{

wait();//打開(kāi)鎖,等候Producer填值

}catch(InterruptedExceptione){}}available=false;notifyAll();returncontents;}publicsynchronizedvoidput(intvalue){while(available==true){try{

wait();//打開(kāi)鎖,等候Consumer取值

}catch(InterruptedExceptione){}}contents=value;available=true;

notifyAll();}}java.lang.Objectpublicfinalvoidwait()throwsInterruptedExceptionpublicfinalvoidwait(longtimeout)throwsInterruptedExceptionpublicfinalvoidnotifyAll()//喚醒所有等待的線程publicfinalvoidnotify()//隨機(jī)喚醒一個(gè)等待的線程16線程的同步publicclassCubbyHole{privateintcontents;privatebooleanavailable=false;publicsynchronizedintget(){while(available==false){try{

wait();//打開(kāi)鎖,等候Producer填值

}catch(InterruptedExceptione){}}available=false;notifyAll();returncontents;}publicsynchronizedvoidput(intvalue){while(available==true){try{

wait();//打開(kāi)鎖,等候Consumer取值

}catch(InterruptedExceptione){}}contents=value;available=true;

notifyAll();}}線程consumerget()判斷當(dāng)前是否存有值有沒(méi)有設(shè)置為空喚醒producer取值釋放鎖定等待新值線程producerput()判斷當(dāng)前是否存有值有沒(méi)有釋放鎖定等待取值放值設(shè)置為有喚醒consumer17線程啟動(dòng)newSimpleThread1("Jamaica").start();classSimpleThread1extendsThread{……}SimpleThread2a=newSimpleThread2("Jack");Threadthread=newThread

溫馨提示

  • 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)論