




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十三章多線程遼寧機(jī)電職業(yè)技術(shù)學(xué)院信息工程系軟件教研室遲勇回顧補(bǔ)充代碼完成:使用字符流從指定文件中讀取數(shù)據(jù) FileReaderfr=newFileReader("C:\\myproject\\document\\readme1.txt"); charc[]=newchar[260];//定義了字符型數(shù)組作為緩沖區(qū)while(fr.
(c)!=-1){//從流fr中讀入字符到數(shù)組c中 Stringstr=newString(
); System.out.println(“正在寫出到控制臺(tái):”+str);
}
fr.close();
cread本章學(xué)習(xí)任務(wù)使用線程改造時(shí)鐘程序利用多線程同步技術(shù)提取賬戶資金設(shè)置線程優(yōu)先級(jí),模擬乘客登車本章技能目標(biāo)了解Java多線程機(jī)制的意義學(xué)會(huì)創(chuàng)建線程的兩種基本方法了解線程的生命周期掌握線程的同步和調(diào)度技巧預(yù)習(xí)檢查(1)--預(yù)習(xí)新單詞單詞釋義單詞釋義ProcessThreadMulti-ThreadPoolRunnablesleepjoinSynchronizednotify預(yù)習(xí)檢查(2)實(shí)現(xiàn)多線程的兩種方式:繼承java.lang.Thread超類、實(shí)現(xiàn)java.lang.Runnable接口;多線程-內(nèi)容目錄線程概述多線程的實(shí)現(xiàn)線程的同步與調(diào)度13.1線程的概述每個(gè)應(yīng)用程序都是系統(tǒng)的一個(gè)進(jìn)程(Process),它們擁有自己獨(dú)立內(nèi)存空間和系統(tǒng)資源,互不干擾。它們的數(shù)據(jù)互不關(guān)聯(lián)、彼此獨(dú)立,只是通過分配的進(jìn)程ID號(hào)(PID)來識(shí)別。線程(Thread)與進(jìn)程類似,是程序中一個(gè)具有獨(dú)立順序的程序流,它有自己的開始、代碼體和結(jié)束。一個(gè)進(jìn)程可以包含若干個(gè)線程。但與進(jìn)程不同的是,線程之間可以共享內(nèi)存空間和資源,線程間切換的系統(tǒng)開銷遠(yuǎn)小于進(jìn)程,所以有時(shí)我們也把線程稱為輕進(jìn)程(Light-weightProcess)。13.1線程的概述表13-1系統(tǒng)隊(duì)列中的進(jìn)程與線程……
進(jìn)程2線程1線程2數(shù)據(jù)資源
進(jìn)程1線程1線程2數(shù)據(jù)資源單線程,就是說一個(gè)應(yīng)用進(jìn)程中只包含一個(gè)線程(即主線程),此線程運(yùn)行結(jié)束則進(jìn)程也會(huì)結(jié)束。多線程(Multi-Thread)就是在操作多任務(wù)的思想基礎(chǔ)上,將一個(gè)進(jìn)程再分解為若干個(gè)線程,從而使單個(gè)進(jìn)程也可以同時(shí)完成多種任務(wù)。單線程與多線程模式對(duì)比圖13-2單線程運(yùn)行時(shí)序圖CPU運(yùn)行時(shí)刻T線程2線程1線程阻塞執(zhí)行請(qǐng)求1請(qǐng)求2處理1下載數(shù)據(jù)1處理2下載數(shù)據(jù)2圖13-2單線程運(yùn)行時(shí)序圖CPU運(yùn)行時(shí)刻T線程2線程1線程阻塞執(zhí)行請(qǐng)求1請(qǐng)求2處理1下載數(shù)據(jù)1處理2下載數(shù)據(jù)2多線程的比喻再做一個(gè)比較容易理解的比喻:畢業(yè)酒會(huì)上,同學(xué)們圍坐在一個(gè)圓桌子旁,每人面前有一個(gè)大酒杯,并且有一個(gè)服務(wù)生繞著桌子專門為大家斟滿酒,因?yàn)楸雍艽?,同學(xué)們的酒量又不行,服務(wù)生已經(jīng)繞著桌子轉(zhuǎn)了一圈,大家面前的酒還沒喝完,但是熱心的服務(wù)生會(huì)再次為大家斟滿酒,這樣周而復(fù)始,在桌子旁的每個(gè)人可能都感覺自己酒杯里的酒始終沒有喝完,而這其實(shí)都是那位熱心的服務(wù)生的功勞。我們假設(shè)每個(gè)人喝酒的動(dòng)作都是一個(gè)線程,那么服務(wù)生就是高效率的CPU,而他手里的酒就是要下載或處理的資源。多線程-內(nèi)容目錄線程概述多線程的實(shí)現(xiàn)線程的同步與調(diào)度13.2多線程(Multi-Thread)的實(shí)現(xiàn)1多線程的改造示例2構(gòu)造多線程的方式3線程的常用方法4線程的生命周期13.2.1多線程的改造實(shí)例在第11章我們?cè)?jīng)接觸過線程的例子,借助線程實(shí)現(xiàn)了一個(gè)動(dòng)畫的繪制,并且介紹了Thread類的靜態(tài)方法sleep(),它可使當(dāng)前線程休眠,具體請(qǐng)參考前面示例11-11。下面先來看一個(gè)簡(jiǎn)單的例子,借此了解使用多線程的必要意義。我們希望在Applet中顯示一個(gè)時(shí)鐘,并且能顯示每一秒鐘的變化,它的代碼如下:例13-1:Applet時(shí)鐘程序DigitalClock.htm程序代碼<HTML><BODYBGCOLOR="000000"><CENTER><APPLET> code ="DigitalClock.class" width ="500" height ="100"</APPLET></CENTER></BODY></HTML>例13-1:Applet時(shí)鐘程序importjava.awt.Graphics;importjava.awt.Font;importjava.util.Date;publicclassDigitalClockextendsjava.applet.Applet{ FonttheFont=newFont("TimesRoman",Font.BOLD,24);//定義字體
DatetheDate=newDate();//初始化Date實(shí)例為當(dāng)前日期
DigitalClock.java
程序代碼publicvoidstart() { while(true) { theDate=newDate(); repaint();//發(fā)出重繪請(qǐng)求
try{ Thread.sleep(1000);//線程休眠1秒種
}catch(InterruptedExceptione){} }} publicvoidpaint(Graphicsg) { g.setFont(theFont);//設(shè)置字體格式
g.drawString(theDate.toString(),10,50);//繪制當(dāng)前日期字符串
}}例13-1:Applet時(shí)鐘程序運(yùn)行出現(xiàn)的問題代碼的運(yùn)行結(jié)果:這個(gè)時(shí)鐘并沒有正常地運(yùn)轉(zhuǎn)起來,這是為什么呢?時(shí)鐘沒有正常運(yùn)轉(zhuǎn)的原因是在于:無限循環(huán)while(true)。這個(gè)程序并沒有應(yīng)用多線程,整個(gè)Applet只有一個(gè)主線程,并且被while(true)獨(dú)占,它占據(jù)了這個(gè)程序的所有CPU時(shí)間和資源。下面我們改造這個(gè)程序,讓它支持多線程,如示例13-2所示。DigitalClock.java程序代碼例13-2:改造后的Applet時(shí)鐘程序importjava.awt.Graphics;importjava.awt.Font;importjava.util.Date;/*程序?qū)崿F(xiàn)了Runnable接口,來引入多線程功能*/publicclassDigitalClockextendsjava.applet.AppletimplementsRunnable{ FonttheFont=newFont("TimesRoman",Font.BOLD,24); DatetheDate=newDate(); Threadrunner;//定義了線程類實(shí)例
例13-2:改造后的Applet時(shí)鐘程序--2
publicvoidstart() { if(runner==null)//判斷線程是否為空
{ runner=newThread(this);//初始化線程類實(shí)例
runner.start();//線程類實(shí)例進(jìn)入就緒狀態(tài)
} } publicvoidstop() { if(runner!=null) { runner.stop();//終止線程
runner=null;//釋放線程所占內(nèi)存空間
} }
publicvoidrun()//實(shí)現(xiàn)Runnable接口的run()方法
{ while(true) { theDate=newDate(); repaint(); try{ Thread.sleep(1000);} catch(InterruptedExceptione){} } } publicvoidpaint(Graphicsg) { g.setFont(theFont); g.drawString(theDate.toString(),10,50); }}運(yùn)行結(jié)果【運(yùn)行結(jié)果】運(yùn)行這個(gè)Applet程序,發(fā)現(xiàn)時(shí)鐘可以正常運(yùn)轉(zhuǎn),如圖所示。13.2.2構(gòu)造多線程的方式Thread類的構(gòu)造方法如下:Thread([ThreadGroupgroup],[Runnabletarget],[Stringname]); group參數(shù)指定該線程所屬的線程組;target作為其運(yùn)行對(duì)象,它必須實(shí)現(xiàn)Runnable接口;name為線程名稱。三個(gè)參數(shù)為可選,當(dāng)某個(gè)參數(shù)為null時(shí),構(gòu)造方法可以為:Thread();Thread(Runnabletarget);Thread(Runnabletarget,Stringname);Thread(Stringname);Thread(ThreadGroupgroup,Runnabletarget);Thread(ThreadGroupgroup,Stringname);構(gòu)造多線程的方式Runnable接口中有run()方法,Thread類也有run()方法,它是線程運(yùn)行的主體,線程運(yùn)行所需的代碼寫在此方法體內(nèi),所以應(yīng)該或必須重寫run()方法來完成所需功能。下面介紹創(chuàng)建線程的兩種方法:繼承Thread超類和實(shí)現(xiàn)Runnable接口。方式1:繼承Thread類定義的線程類可以通過繼承java.lang.Thread超類來實(shí)現(xiàn),語法如下:
publicclass<類名>extendsThread{……}例13-3:多線程顯示輸出TwoThread.java程序代碼publicclassTwoThread{ staticThread01th01;//定義線程類Thread01實(shí)例th01 staticThread02th02;//定義線程類Thread02實(shí)例th02 publicstaticvoidmain(Stringargs[]){ th01=newThread01("thisisthread01!");//創(chuàng)建實(shí)例th01 th02=newThread02("Iamthread02!");//創(chuàng)建實(shí)例th02 th01.start();//實(shí)例th01進(jìn)入就緒狀態(tài)
th02.start();//實(shí)例th02進(jìn)入就緒狀態(tài)
}}方式1:繼承Thread類--2classThread01extendsThread{ publicThread01(Stringname){ super(name);}//為線程命名 publicvoidrun()//重寫線程體
{ for(inti=0;i<5;i++) { System.out.println(this.getName());//輸出線程名
try{Thread.sleep(500);}
catch(InterruptedExceptione){} } }}classThread02extendsThread{ publicThread02(Stringname){ super(name);}//為線程命名
publicvoidrun()//重寫線程體
{ for(inti=0;i<5;i++)
{ System.out.println(this.getName());//輸出線程名
try{Thread.sleep(300);}//線程睡眠,讓出CPU catch(InterruptedExceptione){} } } }【運(yùn)行結(jié)果】【運(yùn)行結(jié)果】運(yùn)行結(jié)果如圖所示,兩個(gè)線程實(shí)例名交互輸出。方式2:實(shí)現(xiàn)Runnable接口定義的線程類在構(gòu)造可以通過一個(gè)實(shí)現(xiàn)了java.lang.Runnable接口的目標(biāo)對(duì)象來實(shí)現(xiàn),語法如下:
publicclass<類名>extends<父類名>implementsRunnable
{publicvoidrun(){……}//重寫Runnable接口中的run()方法
}
使用Runnable接口來構(gòu)造線程的優(yōu)點(diǎn)顯而易見:Java不支持多繼承,為了繼承父類,只能采取實(shí)現(xiàn)接口的方式來構(gòu)造線程。
例如前面的Applet示例13-2。需要注意的是使用這種方式構(gòu)建線程時(shí),必須指明線程的目標(biāo)對(duì)象target,即指明線程的主體run()方法的定義位置,其程序結(jié)構(gòu)大體如下:
實(shí)現(xiàn)Runnable接口的程序結(jié)構(gòu)publicclassDigitalClockextendsAppletimplementsRunnable{ Threadrunner;//定義線程類實(shí)例
publicvoidstart() { if(runner==null) { runner=newThread(this);//初始化線程類實(shí)例,并指明target對(duì)象this runner.start();//線程就緒,獲得CPU運(yùn)行調(diào)度后,將開始運(yùn)行run()方法
} } publicvoidrun(){……}//run()方法定義在實(shí)現(xiàn)Runnable接口的類中}13.2.3線程的常用成員方法下面是線程操作中常用的一些方法,包括前面使用過的start()、sleep()、run()等方法;下一小節(jié)將要介紹的線程同步和調(diào)度join()、yield()等方法;還有用于設(shè)置或獲取線程屬性的getName()、getPriority()等方法。線程生命周期相關(guān)方法voidstart()使該線程就緒。當(dāng)CPU開始執(zhí)行該線程時(shí)將調(diào)用run方法。voidrun()該線程運(yùn)行的主體。voidstop()已過時(shí)。用于退出線程,該方法具有不安全性。退出目標(biāo)線程應(yīng)采取判斷線程對(duì)象是否改變并修改線程變量為null的方式進(jìn)行。13.2.3線程的常用成員方法線程屬性相關(guān)方法booleanisAlive()測(cè)試線程是否處于活動(dòng)狀態(tài)。booleanisDaemon()測(cè)試該線程是否為后臺(tái)線程。staticThread
currentThread()返回對(duì)當(dāng)前正在執(zhí)行的線程對(duì)象的引用。String
getName()返回該線程的名稱。intgetPriority()返回線程的優(yōu)先級(jí)。Thread.State
getState()返回該線程的狀態(tài)。ThreadGroup
getThreadGroup()返回該線程所屬的線程組。staticbooleaninterrupted()測(cè)試當(dāng)前線程是否已經(jīng)中斷。voidsetDaemon(booleanon)將該線程標(biāo)記為后臺(tái)線程。voidsetName(Stringname)改變線程名為參數(shù)name。voidsetPriority(intnewPriority)更改線程的優(yōu)先級(jí)。String
toString()返回該線程的字符串表示形式。13.2.3線程的常用成員方法調(diào)度與線程同步方法voiddestroy()已過時(shí)。該方法用于銷毀線程,可能會(huì)出現(xiàn)死鎖。voidresume()已過時(shí)。該方法只與suspend()一起使用,用于恢復(fù)掛起的線程,有可能造成死鎖。staticvoidsleep(longmillis)在指定的longmillis毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)。voidinterrupt()中斷線程。voidjoin()等待該線程終止。voidjoin(longmillis)等待該線程終止的時(shí)間最長(zhǎng)為longmillis毫秒。voidsuspend()已過時(shí)。將目標(biāo)線程掛起,可能會(huì)出現(xiàn)死鎖。staticvoidyield()暫停當(dāng)前正在執(zhí)行的線程對(duì)象,并執(zhí)行其他線程。13.2.4線程的生命周期在Java程序中,線程就是一段Java代碼,就是類的對(duì)象。同其它對(duì)象(比如Applet)一樣,它也有從新生到消亡的生命周期,線程的生命周期有5種狀態(tài):新生、就緒、運(yùn)行、阻塞、死亡,如圖13-4所示。新生就緒運(yùn)行死亡newstart()run()stop()阻塞sleep()、wait()yield()表13-4線程的生命周期多線程-內(nèi)容目錄線程概述多線程的實(shí)現(xiàn)線程的同步與調(diào)度13.3線程的同步和調(diào)度1一個(gè)失敗的多線程示例2線程同步(synchronized)3有關(guān)線程的調(diào)度方法13.3.1 一個(gè)失敗的多線程示例在多線程的程序中,由于多個(gè)線程可以同時(shí)訪問同一個(gè)變量或方法,如果一個(gè)線程對(duì)它們的訪問尚未結(jié)束,另一個(gè)線程就開始處理,就會(huì)產(chǎn)生錯(cuò)誤的結(jié)果。例如,現(xiàn)銀行有一賬戶,假設(shè)有多個(gè)客戶在不同的取款臺(tái)同時(shí)對(duì)這一賬戶取款,前面的客戶提款操作尚未完成,而后面的客戶就開始提款操作,可能此時(shí)后面的客戶是在前面客戶尚未更新的賬戶余額上操作,那就會(huì)造成透支。請(qǐng)先看下面的失敗案例。例13-4:利用多線程模擬多個(gè)客戶同時(shí)提取同一賬戶資金的情況銀行賬號(hào)類:BankAccount提款客戶類:Customer銀行系統(tǒng)主類:BankSystem運(yùn)行結(jié)果會(huì)發(fā)現(xiàn)結(jié)果運(yùn)行不正確!顯示結(jié)果第五行:“*****客戶乙提款后:余額為4500元*****”,實(shí)際應(yīng)為4000元!而最后余額實(shí)際應(yīng)為3000元?!具\(yùn)行結(jié)果】按照順序編譯,運(yùn)行這三個(gè)類文件,結(jié)果如圖所示:【程序分析】解決這種問題的方法解決這種問題的方法應(yīng)當(dāng)采用多線程的“同步機(jī)制”。所謂“同步”(synchronized),是指將被當(dāng)前線程訪問的對(duì)象或方法加鎖(即獨(dú)占資源,其他想訪問此資源的線程只有等待),只有取得開鎖鑰匙的線程才能訪問該對(duì)象或方法。在例13-4中,takeMoney()方法將被客戶甲和客戶乙兩個(gè)線程訪問,如果能限制在客戶甲訪問該方法時(shí),客戶乙不能訪問該方法,直到客戶甲退出takeMoney()方法,客戶乙才能訪問takeMoney()方法,這樣,就可以保證賬戶余額的正確更新。13.3.2 線程同步(synchronized)實(shí)現(xiàn)同步訪問某一對(duì)象或方法,必須在被訪問的對(duì)象或方法前加synchronized關(guān)鍵字。如果對(duì)象或方法被設(shè)為“同步”,在同一時(shí)刻將只能有一個(gè)線程操作此對(duì)象或方法(相當(dāng)于在要操作的對(duì)象和方法上加了鎖)。
如果將示例13-4的takeMoney()加上同步控制符synchronized(見代碼第4行,其它代碼不變),將會(huì)得到正確的結(jié)果。見示例13-5。
例13-5:利用多線程同步技術(shù)提取賬戶資金的情況publicsynchronizedstaticvoidtakeMoney(Stringclient,intiAmount)//同步支取資金方法,此處添加了synchronized關(guān)鍵字13.3.3線程的調(diào)度有時(shí)一些線程需要共享一些數(shù)據(jù)資源,例如典型的“生產(chǎn)者-消費(fèi)者”的例子,生產(chǎn)者向倉庫輸入一份商品,消費(fèi)者從倉庫取出一份商品,生產(chǎn)者必須預(yù)先將一份商品放入倉庫,否則消費(fèi)者無法從空倉庫取出商品。再比如兩個(gè)線程同時(shí)操作一個(gè)網(wǎng)絡(luò)文件,一個(gè)將數(shù)據(jù)寫入文件,一個(gè)從文件中讀取數(shù)據(jù),要求在數(shù)據(jù)完全寫入文件后才能讀取,這些情況下,要考慮這些線程的運(yùn)行狀態(tài),即在一定條件下線程才可以切換,這需要“調(diào)度”來達(dá)到預(yù)期效果。調(diào)度的方法調(diào)度的方法通常有兩種:1)設(shè)置線程優(yōu)先級(jí)完成自動(dòng)調(diào)度;2)使用等待(wait)、喚醒(notify)等方法完成手工調(diào)度。1.線程優(yōu)先級(jí)(Priority)在多線程機(jī)制下,在線程等待池中的哪個(gè)線程能夠被優(yōu)先執(zhí)行,取決于線程的“優(yōu)先級(jí)”,優(yōu)先級(jí)高的線程優(yōu)先獲得CPU運(yùn)行權(quán)。Java中線程的優(yōu)先級(jí)分為1~10級(jí),1級(jí)(即MIN_PRIORITY)最低,10級(jí)(即MAX_PRIORITY)最高。如果不做優(yōu)先級(jí)設(shè)置,通常線程的默認(rèn)優(yōu)先級(jí)為5級(jí)(即NORM_PRIORITY),如果要改變線程優(yōu)先級(jí),可以使用setPriority()方法設(shè)置。例13-6:設(shè)置線程優(yōu)先級(jí),模擬乘客登車?yán)?3-6:設(shè)置線程優(yōu)先級(jí),模擬乘客登車(假設(shè)乘客中有兒童、婦女和老人,其中,兒童優(yōu)先上車,老年人次之,最后是婦女,每個(gè)站點(diǎn)上車的人數(shù)是隨機(jī)的)/*子線程類*/classPassengerextendsThread{publicPassenger(StringpassengerName){super(passengerName);//設(shè)置線程名稱}publicvoidrun(){intsum=(int)(Math.random()*5);//隨機(jī)生成站點(diǎn)人數(shù)System.out.println("===共有"+sum+"個(gè)"+this.getName()+"正在等待上車.===");for(inti=0;i<sum;i++){System.out.println("現(xiàn)在第"+(i+1)+"個(gè)"+this.getName()+"正在上車.");//顯示上車乘客的身份}}publicclassGetOnBus{publicstaticvoidmain(String[]args){Passengerchildren=newPassenger("學(xué)齡前兒童");Passengerwomen=newPassenger("婦女");Passengerelder=newPassenger("老年人");children.setPriority(10); //設(shè)置children為最高優(yōu)先級(jí)elder.setPriority(Thread.NORM_PRIORITY);//設(shè)置elder為普通優(yōu)先級(jí)women.setPriority(1); //設(shè)置women為最低優(yōu)先級(jí)women.start(); //線程就緒elder.start(); children.start(); }}運(yùn)行結(jié)果但是這種調(diào)度,不一定按照我們?cè)O(shè)想的順序完成,因?yàn)榫€程執(zhí)行的先后順序是由操作系統(tǒng)對(duì)CPU的調(diào)度機(jī)制來控制的,即使給線程設(shè)置高優(yōu)先級(jí),也不能確定它一定會(huì)得到CPU的執(zhí)行時(shí)間!2.手工調(diào)度由于自動(dòng)調(diào)度的局限,使得略為復(fù)雜的線程控制就無法實(shí)現(xiàn),如果我們希望線程能按照我們的預(yù)期那樣地運(yùn)行,就必須使用wait()與notify()等方法來手工調(diào)度。wait()與notify()、notifyAll()等方法被定義在Object類中:wait()方法可使當(dāng)前線程處于等待(阻塞)狀態(tài),從而釋放自己的線程鎖給其它線程使用,直到其它線程使用notify()或notifyAll()方法喚醒它為止。notifyAll()方法可喚醒所有調(diào)用了wait()方法而處于等待的線程,而notify()方法可喚醒單個(gè)線程,但這種喚醒是隨意性的。(補(bǔ)充實(shí)例13-7:)例13-7使用手工調(diào)度改造前面用戶提款繼續(xù)改造前面用戶提款的實(shí)例(例13-4、例13-5),使用戶提款的順序可以按照我們?cè)O(shè)定的過程來執(zhí)行。改造過程如下:(1)為Customer類添加一個(gè)公用的BankAccount類對(duì)象,并改造其構(gòu)造方法;(2)為BankAccount類的takeMoney()方法添加wait()和notify()方法,實(shí)現(xiàn)手工調(diào)度。例13-7使用手工調(diào)度改造前面用戶提款銀行賬號(hào)類:BankAccountclassBankAccount{ privatestaticinttotalBalance=1000;//假設(shè)賬戶余額為1000元 publicsynchronizedvoidtakeMoney(Stringclient,intiAmount)//支取資金方法 { intgetBalance=totalBalance;//取得賬戶余額 getBalance-=iAmount;//根據(jù)支取現(xiàn)金的數(shù)量,修正賬戶余額 /*利用sleep(1000)休眠1秒鐘,模擬提款時(shí)數(shù)據(jù)庫更新需要的時(shí)間*/ try{ Thread.sleep(1000); }catch(InterruptedExceptione){ } totalBalance=getBalance;//提款后,更新賬戶余額 System.out.println("*****"+client+"提款后:"+"余額為"+totalBalance+"元"+"*****");
notify();//通知處于等待狀態(tài)的線程,可以啟動(dòng)
try{
wait();//使當(dāng)前線程處于等待狀態(tài)
}catch(Exceptione){ } } publicstaticintgetBalance()//讀取總余額 { returntotalBalance; }}例13-7使用手工調(diào)度改造前面用戶提款提款客戶類:CustomerclassCustomerextendsThread//客戶線程{
BankAccountaccount;//用戶要操作的公用對(duì)象 privateintgetMoney;//客戶提款額 publicCustomer(StringcustomerName,intmoney,BankAccountaccount)//構(gòu)造方法 { super(customerName); getMoney=money;
this.account=account; } publicvoidrun()//客戶線程主體 { for(in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 保險(xiǎn)業(yè)務(wù)員答謝會(huì)流程
- 提優(yōu)點(diǎn)11 概率與數(shù)列(含馬爾科夫鏈問題)
- 2024年嵌入式軟件服務(wù)項(xiàng)目資金籌措計(jì)劃書代可行性研究報(bào)告
- 2024年發(fā)射塔架、發(fā)射臺(tái)以及移動(dòng)發(fā)射裝置資金籌措計(jì)劃書代可行性研究報(bào)告
- 2024年電力電容器及其配套設(shè)備項(xiàng)目投資申請(qǐng)報(bào)告代可行性研究報(bào)告
- MySQL數(shù)據(jù)庫應(yīng)用技術(shù)課件:數(shù)據(jù)操作
- 2025年財(cái)務(wù)管理考試知識(shí)精粹試題及答案
- 形成總結(jié)2025年財(cái)務(wù)管理考試試題及答案
- 2025年財(cái)務(wù)管理審計(jì)證據(jù)試題及答案
- 醫(yī)生護(hù)理實(shí)操考試試題及答案
- 飽和蒸汽密度表
- 安全管理職業(yè)健康體系適用法律法規(guī)要求清單(2023年7月版)
- 農(nóng)業(yè)政策與法規(guī)復(fù)習(xí)題
- MOOC 農(nóng)學(xué)概論-福建農(nóng)林大學(xué) 中國(guó)大學(xué)慕課答案
- 模擬法庭劇本(五篇)
- 美軍浮空器雷達(dá)系統(tǒng)現(xiàn)狀淺析
- 我的家鄉(xiāng)陜西省安康市
- 八角茴香油教學(xué)課件
- 教學(xué)機(jī)房規(guī)劃方案
- 國(guó)家文化安全教育課件
- 可行性研究報(bào)告編制服務(wù)投標(biāo)方案
評(píng)論
0/150
提交評(píng)論