Java面向對象程序設計-課件 第8章 多線程_第1頁
Java面向對象程序設計-課件 第8章 多線程_第2頁
Java面向對象程序設計-課件 第8章 多線程_第3頁
Java面向對象程序設計-課件 第8章 多線程_第4頁
Java面向對象程序設計-課件 第8章 多線程_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

{

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

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

newSimpleThread(“A").start();

newSimpleThread(“B").start();}}9線程創(chuàng)建的兩種方式繼承java.lang.Thread類,重寫run()方法實現(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共享資源的訪問多個線程對同一資源進行操作(讀/寫)當多個線程訪問同一數(shù)據(jù)項(如靜態(tài)字段、可全局訪問對象的實例字段或共享集合)時,需要確保它們協(xié)調了對數(shù)據(jù)的訪問,這樣它們都可以看到數(shù)據(jù)的一致視圖,而且相互不會干擾另一方的更改synchronized關鍵詞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(“消費了:"+value);}}}publicclassProducerConsumerTest{publicstaticvoidmain(String[]args){CubbyHoleh=newCubbyHole();Producerp=newProducer(h);Consumerc=newConsumer(h);p.start();c.start();}}13給關鍵部分(CriticalSection)加鎖(lock)CubbyHole對象synchronized關鍵詞

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論