(教案)Java程序設(shè)計(jì)精編教程(第3版)-教案48學(xué)時(shí)-第12章_第1頁(yè)
(教案)Java程序設(shè)計(jì)精編教程(第3版)-教案48學(xué)時(shí)-第12章_第2頁(yè)
(教案)Java程序設(shè)計(jì)精編教程(第3版)-教案48學(xué)時(shí)-第12章_第3頁(yè)
(教案)Java程序設(shè)計(jì)精編教程(第3版)-教案48學(xué)時(shí)-第12章_第4頁(yè)
(教案)Java程序設(shè)計(jì)精編教程(第3版)-教案48學(xué)時(shí)-第12章_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

PAGEPAGE15授課內(nèi)容學(xué)時(shí)分配教學(xué)方法與手段進(jìn)度計(jì)劃(周次)課堂講授(學(xué)時(shí))上機(jī)實(shí)踐(學(xué)時(shí))Java入門2201Java應(yīng)用程序的基本結(jié)構(gòu)4221-2標(biāo)識(shí)符與簡(jiǎn)單的數(shù)據(jù)類型運(yùn)算符、表達(dá)式與語(yǔ)句2202類與對(duì)象8623~4子類與繼承4405接口與實(shí)現(xiàn)4226內(nèi)部類與異常類2207常用實(shí)用類4407-8輸入、輸出流2208組件及事件處理6429-10Java多線程機(jī)制44010-11Java網(wǎng)絡(luò)編程22011JDBC數(shù)據(jù)庫(kù)操作42212總學(xué)時(shí)=SUM(ABOVE)48=SUM(ABOVE)38=SUM(ABOVE)10

各章教學(xué)實(shí)施計(jì)劃章節(jié)題目第12章Java多線程機(jī)制12.1節(jié)-12.4節(jié)學(xué)時(shí)2教學(xué)目的、要求(分了解、理解、掌握三個(gè)層次):1、了解Java中的線程。2、掌握Thread類與線程的創(chuàng)建。3、掌握線程的常用方法。教學(xué)內(nèi)容(包括基本內(nèi)容、重點(diǎn)、難點(diǎn)):基本內(nèi)容:進(jìn)程與線程Java中的線程Thread類與線程的創(chuàng)建線程的常用方法重點(diǎn)多線程的概念;如何創(chuàng)建多線程。難點(diǎn)理解多線程機(jī)制。討論、思考題、作業(yè):P271習(xí)題121題-6題預(yù)習(xí)第12.5節(jié)-12.7節(jié)參考及補(bǔ)充內(nèi)容:學(xué)習(xí)操作系統(tǒng)的基本知識(shí),了解操作系統(tǒng)中如何管理CUP資源的。

課堂教學(xué)實(shí)施計(jì)劃第16課教學(xué)過(guò)程設(shè)計(jì):復(fù)習(xí)分鐘;授新課95分鐘討論5分鐘;其它分鐘授課類型(請(qǐng)打√):理論課√討論課□實(shí)驗(yàn)課□習(xí)題課□其它□教學(xué)方式(請(qǐng)打√):講授√討論□示教□指導(dǎo)□其它□教學(xué)手段(請(qǐng)打√):多媒體模型□實(shí)物□掛圖□音像□其它√主要內(nèi)容進(jìn)程與線程Java中的線程Thread類與線程的創(chuàng)建線程的常用方法重點(diǎn)多線程的概念;如何創(chuàng)建多線程。難點(diǎn)理解多線程機(jī)制。第12章Java多線程機(jī)制§12.1進(jìn)程與線程§12.1.1操作系統(tǒng)與進(jìn)程程序是一段靜態(tài)的代碼,它是應(yīng)用軟件執(zhí)行的藍(lán)本。進(jìn)程是程序的一次動(dòng)態(tài)執(zhí)行過(guò)程,它對(duì)應(yīng)了從代碼加載、執(zhí)行至執(zhí)行完畢的一個(gè)完整過(guò)程,這個(gè)過(guò)程也是進(jìn)程本身從產(chǎn)生、發(fā)展至消亡的過(guò)程。現(xiàn)代操作系統(tǒng)可以同時(shí)管理一個(gè)計(jì)算機(jī)系統(tǒng)中的多個(gè)進(jìn)程,即可以讓計(jì)算機(jī)系統(tǒng)中的多個(gè)進(jìn)程輪流使用CPU資源?!?2.1.2進(jìn)程與線程線程是比進(jìn)程更小的執(zhí)行單位,一個(gè)進(jìn)程在其執(zhí)行過(guò)程中,可以產(chǎn)生多個(gè)線程,形成多條執(zhí)行線索,每條線索,即每個(gè)線程也有它自身的產(chǎn)生、存在和消亡的過(guò)程。線程間可以共享進(jìn)程中的某些內(nèi)存單元(包括代碼與數(shù)據(jù)),線程的中斷與恢復(fù)可以更加節(jié)省系統(tǒng)的開銷?!?2.2Java中的線程§12.2.1Java的多線程機(jī)制Java語(yǔ)言的一大特性點(diǎn)就是內(nèi)置對(duì)多線程的支持。Java虛擬機(jī)快速地把控制從一個(gè)線程切換到另一個(gè)線程。這些線程將被輪流執(zhí)行,使得每個(gè)線程都有機(jī)會(huì)使用CPU資源。§12.2.2線程的狀態(tài)與生命周期(重點(diǎn))建的線程在它的一個(gè)完整的生命周期中通常要經(jīng)歷如下的四種狀態(tài):1新建:當(dāng)一個(gè)Thread類或其子類的對(duì)象被聲明并創(chuàng)建時(shí),新生的線程對(duì)象處于新建狀態(tài)。2運(yùn)行:線程必須調(diào)用start()方法(從父類繼承的方法)通知JVM,這樣JVM就會(huì)知道又有一個(gè)新一個(gè)線程排隊(duì)等候切換了。一旦輪到它來(lái)享用CPU資源時(shí),此線程的就可以脫離創(chuàng)建它的主線程獨(dú)立開始自己的生命周期了。3中斷:有4種原因的中斷:JVM將CPU資源從當(dāng)前線程切換給其他線程,使本線程讓出CPU的使用權(quán)處于中斷狀態(tài)。線程使用CPU資源期間,執(zhí)行了sleep(intmillsecond)方法,使當(dāng)前線程進(jìn)入休眠狀。線程使用CPU資源期間,執(zhí)行了wait()方法。線程使用CPU資源期間,執(zhí)行某個(gè)操作進(jìn)入阻塞狀態(tài)。4死亡:處于死亡狀態(tài)的線程不具有繼續(xù)運(yùn)行的能力。線程釋放了實(shí)體。例子1Example12_1.javapublicclassExample12_1{publicstaticvoidmain(Stringargs[]){//主線程SpeakElephantspeakElephant;SpeakCarspeakCar;speakElephant=newSpeakElephant();//創(chuàng)建線程speakCar=newSpeakCar();//創(chuàng)建線程speakElephant.start();//啟動(dòng)線程speakCar.start();//啟動(dòng)線程for(inti=1;i<=15;i++){System.out.print("主人"+i+"");}}}SpeakElephant.javapublicclassSpeakElephantextendsThread{publicvoidrun(){for(inti=1;i<=20;i++){System.out.print("大象"+i+"");}}}SpeakCar.javapublicclassSpeakCarextendsThread{publicvoidrun(){for(inti=1;i<=20;i++){System.out.print("轎車"+i+"");}}}§12.2.3線程調(diào)度與優(yōu)先級(jí)處于就緒狀態(tài)的線程首先進(jìn)入就緒隊(duì)列排隊(duì)等候CPU資源,同一時(shí)刻在就緒隊(duì)列中的線程可能有多個(gè)。Java虛擬機(jī)(JVM)中的線程調(diào)度器負(fù)責(zé)管理線程,調(diào)度器把線程的優(yōu)先級(jí)分為10個(gè)級(jí)別,分別用Thread類中的類常量表示。Java調(diào)度器的任務(wù)是使高優(yōu)先級(jí)的線程能始終運(yùn)行,一旦時(shí)間片有空閑,則使具有同等優(yōu)先級(jí)的線程以輪流的方式順序使用時(shí)間片?!?2.3Thread類與線程的創(chuàng)建§12.3.1使用Thread的子類在Java語(yǔ)言中,用Thread類或子類創(chuàng)建線程對(duì)象。在編寫Thread類的子類時(shí),需要重寫父類的run()方法,其目的是規(guī)定線程的具體操作,否則線程就什么也不做,因?yàn)楦割惖膔un()方法中沒有任何操作語(yǔ)句?!?2.3.2使用Thread類創(chuàng)建線程的另一個(gè)途徑就是用Thread類直接創(chuàng)建線程對(duì)象。使用Thread創(chuàng)建線程通常使用的構(gòu)造方法是:Thread(Runnabletarget)該構(gòu)造方法中的參數(shù)是一個(gè)Runnable類型的接口。在創(chuàng)建線程對(duì)象時(shí)必須向構(gòu)造方法的參數(shù)傳遞一個(gè)實(shí)現(xiàn)Runnable接口類的實(shí)例,該實(shí)例對(duì)象稱作所創(chuàng)線程的目標(biāo)對(duì)象,當(dāng)線程調(diào)用start()方法后,一旦輪到它來(lái)享用CPU資源,目標(biāo)對(duì)象就會(huì)自動(dòng)調(diào)用接口中的run()方法(接口回調(diào))。例子2Example12_2.javapublicclassExample12_2{publicstaticvoidmain(Stringargs[]){Househouse=newHouse();house.setWater(10);Threaddog,cat;dog=newThread(house);cat=newThread(house);//cat和dog的目標(biāo)對(duì)象相同dog.start();cat.start();}}House.javapublicclassHouseimplementsRunnable{intwaterAmount;//用int變量模擬水量publicvoidsetWater(intw){waterAmount=w;}publicvoidrun(){intm=1;while(true){if(waterAmount<=0){return;}waterAmount=waterAmount-m;System.out.println("剩"+waterAmount+"克.");try{Thread.sleep(2000);}catch(InterruptedExceptione){}}}}§12.3.3關(guān)于run()方法啟動(dòng)的次數(shù)對(duì)于具有相同目標(biāo)對(duì)象的線程,當(dāng)其中一個(gè)線程享用CPU資源時(shí),目標(biāo)對(duì)象自動(dòng)調(diào)用接口中的run方法,這時(shí),run方法中的局部變量被分配內(nèi)存空間,當(dāng)輪到另一個(gè)線程享用CPU資源時(shí),目標(biāo)對(duì)象會(huì)再次調(diào)用接口中的run方法,那么,run()方法中的局部變量會(huì)再次分配內(nèi)存空間。也就是說(shuō)run()方法已經(jīng)啟動(dòng)運(yùn)行了兩次,分別運(yùn)行在不同的線程中,即運(yùn)行在不同的時(shí)間片內(nèi)?!?2.4線程的常用方法1start():線程調(diào)用該方法將啟動(dòng)線程,使之從新建狀態(tài)進(jìn)入就緒隊(duì)列排隊(duì),一旦輪到它來(lái)享用CPU資源時(shí),就可以脫離創(chuàng)建它的線程獨(dú)立開始自己的生命周期了。2run():Thread類的run()方法與Runnable接口中的run()方法的功能和作用相同,都用來(lái)定義線程對(duì)象被調(diào)度之后所執(zhí)行的操作,都是系統(tǒng)自動(dòng)調(diào)用而用戶程序不得引用的方法。3sleep(intmillsecond):優(yōu)先級(jí)高的線程可以在它的run()方法中調(diào)用sleep方法來(lái)使自己放棄CPU資源,休眠一段時(shí)間。4isAlive():線程處于“新建”狀態(tài)時(shí),線程調(diào)用isAlive()方法返回false。在線程的run()方法結(jié)束之前,即沒有進(jìn)入死亡狀態(tài)之前,線程調(diào)用isAlive()方法返回true。例子3Example12_3.javapublicclassExample12_3{publicstaticvoidmain(Stringargs[]){Homehome=newHome();ThreadshowTime=newThread(home);showTime.start();}}Home.javaimportjava.util.Date;importjava.text.SimpleDateFormat;publicclassHomeimplementsRunnable{inttime=0;SimpleDateFormatm=newSimpleDateFormat("hh:mm:ss");Datedate;publicvoidrun(){while(true){date=newDate();System.out.println(m.format(date));time++;try{Thread.sleep(1000);}catch(InterruptedExceptione){}if(time==3){Threadthread=Thread.currentThread();thread=newThread(this);thread.start();}}}}5currentThread():該方法是Thread類中的類方法,可以用類名調(diào)用,該方法返回當(dāng)前正在使用CPU資源的線程。6interrupt():一個(gè)占有CPU資源的線程可以讓休眠的線程調(diào)用interrupt()方法“吵醒”自己,即導(dǎo)致休眠的線程發(fā)生InterruptedException異常,從而結(jié)束休眠,重新排隊(duì)等待CPU資源。例子4Example12_4.javapublicclassExample12_4{publicstaticvoidmain(Stringargs[]){Roadroad=newRoad();Threadpolice,driver;police=newThread(road);driver=newThread(road);police.setName("警察");driver.setName("司機(jī)");road.setAttachThread(driver);driver.start();police.start();}}Road.javapublicclassRoadimplementsRunnable{ThreadattachThread;publicvoidsetAttachThread(Threadt){attachThread=t;}publicvoidrun(){Stringname=Thread.currentThread().getName();if(name.equals("司機(jī)")){try{System.out.println("我是"+name+"在馬路上開車.");System.out.println("想睡上一個(gè)小時(shí)后在開車");Thread.sleep(1000*60*60);}catch(InterruptedExceptione){System.out.println(name+"被警察叫醒了");}System.out.println(name+"繼續(xù)開車");}elseif(name.equals("警察")){for(inti=1;i<=3;i++){System.out.println(name+"喊:開車!");try{Thread.sleep(500);}catch(InterruptedExceptione){}}attachTerrupt();//吵醒driver}}}總結(jié)線程是比進(jìn)程更小的執(zhí)行單位。一個(gè)進(jìn)程在其執(zhí)行過(guò)程中,可以產(chǎn)生多個(gè)線程。Java虛擬機(jī)(JVM)中的線程調(diào)度器負(fù)責(zé)管理線程,在采用時(shí)間片的系統(tǒng)中,每個(gè)線程都有機(jī)會(huì)獲得CUP的使用權(quán)。理解線程的創(chuàng)建的兩種方法。作業(yè)P271習(xí)題121題-6題預(yù)習(xí)第12.5節(jié)-12.7節(jié)本章課結(jié)束

章節(jié)題目第12章Java多線程機(jī)制12.5節(jié)-12.7節(jié)學(xué)時(shí)2教學(xué)目的、要求(分了解、理解、掌握三個(gè)層次):1、掌握線程同步。2、理解在同步方法中使用wait()、notify和notifyAll()方法。3、了解線程聯(lián)合。教學(xué)內(nèi)容(包括基本內(nèi)容、重點(diǎn)、難點(diǎn)):線程同步理解在同步方法中使用wait()、notify和notifyAll()方法。線程聯(lián)合重點(diǎn)線程同步難點(diǎn)理解wait()方法、notify()方法。討論、思考題、作業(yè):P271習(xí)題127題-14題預(yù)習(xí)第13章參考及補(bǔ)充內(nèi)容:討論如何實(shí)現(xiàn)線程同步及其必要性。

第17課教學(xué)過(guò)程設(shè)計(jì):復(fù)習(xí)5分鐘;授新課90分鐘討論5分鐘;其它分鐘授課類型(請(qǐng)打√):理論課√討論課□實(shí)驗(yàn)課□習(xí)題課□其它□教學(xué)方式(請(qǐng)打√):講授√討論□示教□指導(dǎo)□其它□教學(xué)手段(請(qǐng)打√):多媒體模型□實(shí)物□掛圖□音像□其它√主要內(nèi)容線程同步理解在同步方法中使用wait()、notify和notifyAll()方法。線程聯(lián)合重點(diǎn)線程同步難點(diǎn)理解wait()方法、notify()方法。§12.5線程同步(重點(diǎn))在處理多線程問題時(shí),我們必須注意這樣一個(gè)問題:當(dāng)兩個(gè)或多個(gè)線程同時(shí)訪問同一個(gè)變量,并且一個(gè)線程需要修改這個(gè)變量。我們應(yīng)對(duì)這樣的問題作出處理。在處理線程同步時(shí),要做的第一件事就是要把修改數(shù)據(jù)的方法用關(guān)鍵字synchronized來(lái)修飾。所謂線程同步就是若干個(gè)線程都需要使用一個(gè)synchronized修飾的方法。例子5Example12_5.javapublicclassExample12_5{publicstaticvoidmain(Stringargs[]){Bankbank=newBank();bank.setMoney(200);Threadaccountant,//會(huì)計(jì)cashier;//出納accountant=newThread(bank);cashier=newThread(bank);accountant.setName("會(huì)計(jì)");cashier.setName("出納");accountant.start();cashier.start();}}Bank.javapublicclassBankimplementsRunnable{intmoney=200;publicvoidsetMoney(intn){money=n;}publicvoidrun(){if(Thread.currentThread().getName().equals("會(huì)計(jì)"))saveOrTake(300);elseif(Thread.currentThread().getName().equals("出納"))saveOrTake(150);;}publicsynchronizedvoidsaveOrTake(intamount){//存取方法if(Thread.currentThread().getName().equals("會(huì)計(jì)")){for(inti=1;i<=3;i++){money=money+amount/3;//每存入amount/3,稍歇一下System.out.println(Thread.currentThread().getName()+"存入"+amount/3+",帳上有"+money+"萬(wàn),休息一會(huì)再存");try{Thread.sleep(1000);//這時(shí)出納仍不能使用saveOrTake方法}catch(InterruptedExceptione){}}}elseif(Thread.currentThread().getName().equals("出納")){for(inti=1;i<=3;i++){//出納使用存取方法取出60money=money-amount/3;//每取出amount/3,稍歇一下System.out.println(Thread.currentThread().getName()+"取出"+amount/3+"帳上有"+money+"萬(wàn),休息一會(huì)再取");try{Thread.sleep(1000);//這時(shí)會(huì)計(jì)仍不能使用saveOrTake方法}catch(InterruptedExceptione){}}}}}§12.6在同步方法中使用wait()、notify和otifyAll()方法(重點(diǎn))wait()方法可以中斷方法的執(zhí)行,使本線程等待,暫時(shí)讓出CPU的使用權(quán),并允許其它線程使用這個(gè)同步方法。notifyAll()方法通知所有的由于使用這個(gè)同步方法而處于等待的線程結(jié)束等待。曾中斷的線程就會(huì)從剛才的中斷處繼續(xù)執(zhí)行這個(gè)同步方法,并遵循“先中斷先繼續(xù)”的原則。notify()方法只是通知處于等待中的線程的某一個(gè)結(jié)束等待。例子6Example12_6.javapublicclassExample12_6{publicstaticvoidmain(Stringargs[]){TicketHouseofficer=newTicketHouse();Threadzhangfei,likui;zhangfei=newThread(officer);zhangfei.setName("張飛");likui=newThread(officer);likui.setName("李逵");zhangfei.start();likui.start();}}TicketHouse.javapublicclassTicketHouseimplementsRunnable{intfiveAmount=2,tenAmount=0,twentyAmount=0;publicvoidrun(){if(Thread.currentThread().getName().equals("張飛")){saleTicket(20);}elseif(Thread.currentThread().getName().equals("李逵")){saleTicket(5);}}privatesynchronizedvoidsaleTicket(intmoney){if(money==5){//如果使用該方法的線程傳遞的參數(shù)是5,就不用等待fiveAmount=fiveAmount+1;System.out.println("給"+Thread.currentThread().getName()+"入場(chǎng)卷,"+Thread.currentThread().getName()+"的錢正好");}elseif(money==20){while(fiveAmount<3){try{System.out.println("\n"+Thread.currentThread().getName()+"靠邊等...");wait();//如果使用該方法的線程傳遞的參數(shù)是20須等待System.out.println("\n"+Thread.currentThread().getName()+"繼續(xù)買票");}catch(InterruptedExceptione){}}fiveAmount=fiveAmount-3;twentyAmount=twentyAmount+1;System.out.println("給"+Thread.currentThread().getName()+"入場(chǎng)卷,"+Thread.currentThread().getName()+"給20,找贖15元");}notifyAll();}}§12.7線程聯(lián)合一個(gè)線程A在占有CPU資源期間,可以讓其它線程調(diào)用join()和本線程聯(lián)合,如:B.join();我們稱A在運(yùn)行期間聯(lián)合了B。例子7Example12_7.javapublicclassExample12_7{publicstaticvoidmain(Stringargs[]){ThreadJoina=newThreadJoin();Threadcustomer=newThread(a);ThreadcakeMaker=newThread(a);customer.setName("顧客");cakeMaker.setName("一桶水師");a.setJoinThread

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論