2023年并行計(jì)算實(shí)驗(yàn)報(bào)告一_第1頁(yè)
2023年并行計(jì)算實(shí)驗(yàn)報(bào)告一_第2頁(yè)
2023年并行計(jì)算實(shí)驗(yàn)報(bào)告一_第3頁(yè)
2023年并行計(jì)算實(shí)驗(yàn)報(bào)告一_第4頁(yè)
2023年并行計(jì)算實(shí)驗(yàn)報(bào)告一_第5頁(yè)
已閱讀5頁(yè),還剩7頁(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)介

江蘇科技大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)課程:并行計(jì)算評(píng)估成績(jī)指導(dǎo)教師實(shí)驗(yàn)名稱:Java多線程編程宋英磊學(xué)號(hào):姓名:班級(jí):完畢日期:2023年()4月22日classMyLabelextendsLabe1implementsRunnable{intvalue;oboo1eanstop=false;publicMyLabel(){super("number");value=0;)opublicvoidrun(){for(:;){ova1ue=(int)(Math.random()*10);//產(chǎn)生一個(gè)0到9的數(shù)字setText(Integer.toString(va1ue));。try(oThread.s1eep(500):。}ocatch(InterruptedExceptione){}0if(Stop)//停止標(biāo)記為true,退出循環(huán),結(jié)束運(yùn)營(yíng)obreak;°}0)0}}【編程技巧】(1)將每個(gè)標(biāo)簽定義為線程方式運(yùn)營(yíng),在運(yùn)營(yíng)中運(yùn)用隨機(jī)數(shù)產(chǎn)生數(shù)字顯示。(2)線程體為一個(gè)循環(huán)語(yǔ)句,只有當(dāng)stop標(biāo)記變量為true,則停止;(3)主程序中將所有標(biāo)簽定義存入一個(gè)數(shù)組,這樣可以方便地對(duì)其進(jìn)行控制,例如,在點(diǎn)擊“停止”按鈕時(shí)將所有標(biāo)簽對(duì)象的stop屬性值設(shè)立為trueo4上機(jī)完畢編程任務(wù)任務(wù)描述:完畢下列編程任務(wù),并將代碼與實(shí)驗(yàn)報(bào)告一起交給教師。令基本題(必做)1)編寫一個(gè)可變顏色的標(biāo)簽,用—個(gè)按鈕控制顏色的改變與停止。點(diǎn)擊按鈕顏色停止變化,再點(diǎn)擊該按鈕顏色乂變化。顏色的變化可用隨機(jī)數(shù)擬定。2)有一個(gè)南北向的橋,只能容納一個(gè)人,現(xiàn)橋的兩邊分別有10人和12人,編制一個(gè)多線程序讓這些人到達(dá)對(duì)岸,每個(gè)人用一個(gè)線程表達(dá),橋?yàn)楣蚕碣Y源。在過(guò)橋的過(guò)程中顯示誰(shuí)在過(guò)橋及其走向。3)編寫一個(gè)圖片播放程序,圖片的文獻(xiàn)名為fiIcOLjpg,file02.jpg,…filen.jpg,其中n由命令行輸入,規(guī)定用多線程自動(dòng)播放。令提高題(選做其中一個(gè))1)編制一個(gè)秒針計(jì)時(shí)器,在畫面包含一個(gè)文本框,顯示秒針值,安排一個(gè)“開始”和“結(jié)束”按鈕,點(diǎn)擊“開始”按鈕則開始計(jì)時(shí),點(diǎn)擊“結(jié)束”停止計(jì)時(shí)。時(shí)間的擬定可借助日歷對(duì)象實(shí)例方法實(shí)現(xiàn),用get(Calendar.SEC0ND)方法得到秒值,用get(Calendar.MINUTE)方法得到分值,用get(Calendar.HOUR)方法得到小時(shí)值。計(jì)算從“開始”到“當(dāng)前”的時(shí)間差即可擬定花費(fèi)的秒數(shù)?!具M(jìn)一步思考】如何將秒針計(jì)時(shí)器設(shè)計(jì)為圖形界面,繪制一個(gè)圓形秒表,秒表的一圈為60秒,根據(jù)花費(fèi)的時(shí)間顯示秒針的變化。2)編寫生產(chǎn)者/消費(fèi)者問題的應(yīng)用程序。生產(chǎn)者以0?200ms的速度隨機(jī)產(chǎn)生30個(gè)小寫字母,消費(fèi)者以0~2s的速度取出字母,并顯示在屏幕上。3)運(yùn)用多線程求解某范圍素?cái)?shù),每個(gè)線程負(fù)責(zé)10000范圍.線程1找1000—10000線程2找10001-20230線程3找20231-30000另開辟一線程專門接受其他線程發(fā)送給它的數(shù)據(jù)(創(chuàng)建管道輸入輸出流),直到3個(gè)線程發(fā)送的數(shù)據(jù)均結(jié)束(結(jié)束標(biāo)記)為止,接受的數(shù)據(jù)以文本形式寫入到文獻(xiàn)xyz.dat中。5思考題(必做)任務(wù)描述:完畢實(shí)驗(yàn)后,完畢下列多選題1)什么因素可導(dǎo)致線程停止執(zhí)行。A.有更高優(yōu)先級(jí)的線程開始執(zhí)行;B.線程調(diào)用了wait()方法;C.線程調(diào)用了yield0方法:0.線程調(diào)用了pause()方法;E.線程調(diào)用了sleep()方法。2)哪個(gè)方法是實(shí)現(xiàn)Runnable接I」所需的?A.wait()B.run()C.stop()D.update()E.resume()3)以下代碼的調(diào)試結(jié)果為?publicclassBgroundextendsThread(publicstaticvoidmain(Stringargv[]){aBgroundb=newBground0;4b.run();)Apublicvoidstart(){afor(inti=0;i<10;i++){System.out.print1nC^Valueofi="+i);A.編譯錯(cuò)誤,沒有定義線程的run方法;B.由于沒有定義線程的run方法,而出現(xiàn)運(yùn)營(yíng)錯(cuò)誤;aC.編譯通過(guò),運(yùn)營(yíng)輸出values0to9aD.編譯通過(guò),運(yùn)營(yíng)無(wú)輸出4)有關(guān)線程的敘述對(duì)的的有:A.通過(guò)繼承Thread類或?qū)崿F(xiàn)Runnab1e接口,可以獲得對(duì)類中方法的互斥鎖定。B.可以獲得對(duì)任何對(duì)象的互斥鎖定。C.線程通過(guò)調(diào)用對(duì)象的synchronized方法可取得對(duì)象的互斥鎖定。D.線程調(diào)度算法是平臺(tái)獨(dú)立的。5)以下哪個(gè)是線程類的方法?yie1d()s1eep(longmsec)-*C.go()D.stopO6)以下哪個(gè)最準(zhǔn)確描述synchronized關(guān)鍵字?A.允許兩線程并行運(yùn)營(yíng),并且互相通信;B.保證在某時(shí)刻只有一個(gè)線程可訪問方法或?qū)ο螅籆.保證允許兩個(gè)或更多解決同時(shí)開始和結(jié)束;I).保證兩個(gè)或更多線程同時(shí)開始和結(jié)束。7實(shí)驗(yàn)總結(jié)實(shí)驗(yàn)?zāi)康?1)掌握多線程編程的特點(diǎn);了解線程的調(diào)度和執(zhí)行過(guò)程:掌握資源共享訪問的實(shí)現(xiàn)方法。1.2知識(shí)要點(diǎn)1.2.1線程的概念(1)線程是程序中的一個(gè)執(zhí)行流,多線程則指多個(gè)執(zhí)行流;(2)線程是比進(jìn)程更小的執(zhí)行單位,一個(gè)進(jìn)程涉及多個(gè)線程;Java語(yǔ)言中線程涉及3部分:虛擬CPU、該CPU執(zhí)行的代碼及代碼所操作的數(shù)據(jù)。Java代碼可認(rèn)為不同線程共享,數(shù)據(jù)也可認(rèn)為不同線程共享;2.2線程的創(chuàng)建(1)方式1:實(shí)現(xiàn)Runnable接口Thread類使用一個(gè)實(shí)現(xiàn)Runnab1e接II的實(shí)例對(duì)?象作為其構(gòu)造方法的參數(shù),該對(duì)象提供了run方法,啟動(dòng)Thread將執(zhí)行該run方法;)方式2:繼承Thread類重寫Thread類的run方法;1.2.3線程的調(diào)度(1)線程的優(yōu)先級(jí)取值范圍門0,在Thread類提供了3個(gè)常量,MIN_PRIORITY=1、MAX_PRI0RITY=10、NORM_PRIORITY=5;用setPriority()設(shè)立線程優(yōu)先級(jí),用getPriority()獲取線程優(yōu)先級(jí);子線程繼承父線程的優(yōu)先級(jí),主線程具有正常優(yōu)先級(jí)。(2)線程的調(diào)度:采用搶占式調(diào)度策略,高優(yōu)先級(jí)的線程優(yōu)先執(zhí)行,在Java中,系統(tǒng)按照優(yōu)先級(jí)的級(jí)別設(shè)立不同的等待隊(duì)列。1.2.4線程的狀態(tài)與生命周期圖14-1線程的生命周期說(shuō)明:新創(chuàng)建的線程處在“新建狀態(tài)”,必須通過(guò)執(zhí)行start()方法,讓其進(jìn)入到“就緒狀態(tài)”,處在就緒狀態(tài)的線程才有機(jī)會(huì)得到調(diào)度執(zhí)行。線程在運(yùn)營(yíng)時(shí)也也許因資源等待或積極睡眠而放棄運(yùn)營(yíng),進(jìn)入“阻塞狀態(tài)”,線程執(zhí)行完畢,或積極執(zhí)行stop方法將進(jìn)入“終止?fàn)顟B(tài)”。2.5線程的同步一解決資源訪問沖突問題(1)對(duì)象的加鎖所有被共享訪問的數(shù)據(jù)及訪問代碼必須作為臨界區(qū),用synchronized加鎖。對(duì)象的同步代碼的執(zhí)行過(guò)程如圖14-2所示。synchronized關(guān)鍵字的使用方法有兩種:用在對(duì)象前面限制一段代碼的執(zhí)行,表達(dá)執(zhí)行該段代碼必須取得對(duì)象鎖。在方法前面,表達(dá)該方法為同步方法,執(zhí)行該方法必須取得對(duì)象鎖。)wait()和notify0方法用于解決多線程中對(duì)資源的訪問控制問題。wai1()方法:釋放對(duì)象鎖,將線程進(jìn)入等待喚醒隊(duì)列;nolify()方法:喚醒等待資源鎖的線程,讓其進(jìn)入對(duì)象鎖的獲取等待隊(duì)列。(3)避免死鎖指多個(gè)線程互相等待對(duì)方釋放持有的鎖,并且在得到對(duì)方鎖之前不會(huì)釋放自己的鎖。3上機(jī)測(cè)試下列程序樣例1:運(yùn)用多線程編程編寫一個(gè)龜兔賽跑程序。?烏龜:速度慢,休息時(shí)間短;?兔子:速度快,休息時(shí)間長(zhǎng);【參考程序1】字符方式下實(shí)現(xiàn)方案classAnimalextendsThroad{intspeed;//速度pub1icAnimal(Stringstr,intspecd){super(str);〃線程名用動(dòng)物名代表this.speed=speed;)publicvoidrun(){intdistance=0;intsleepTime;while(distancc<=1000)(System,out.print1n(getName()+"isat"+distanee);try(distance+=speed://每次跑的距離簡(jiǎn)樸用速度計(jì)算sleepTime=(int)(speed+Math.random()*speed);//速度快休息時(shí)間要長(zhǎng)

s1eep(s1eepTime);}catch(InterruptedExceptione){})))pub1icclassRace{pub1icstaticvoidmain(Stringarg[])(a1=newAnima1("rabit",100);a2=ncwAnimal("turtie”,20);a2.setPriority(Thread.MAX.PRIORITY);//讓烏龜?shù)倪\(yùn)營(yíng)優(yōu)先級(jí)更高a1.start();a2.start();))圖14-3龜兔賽跑的圖形方式運(yùn)行界面圖14-3龜兔賽跑的圖形方式運(yùn)行界面(1)速度快,跑的距離增長(zhǎng)也快,這里簡(jiǎn)樸地將速度加到距離上,未考慮跑的時(shí)間;(2)為了讓烏龜?shù)玫礁嗟倪\(yùn)營(yíng)機(jī)會(huì),采用兩項(xiàng)措施,一讓線程的睡眠時(shí)間與速度成正比,二是讓烏龜?shù)玫礁叩膬?yōu)先級(jí)?!緟⒖汲绦?]一圖形方式下,圖14-3為程序的運(yùn)營(yíng)演示。pub1icc1assrunnerextendsAppletimplementsRunnable{intBeginX=10,EndX=200;〃起點(diǎn)和終點(diǎn)的x坐標(biāo)intRabbitX=BeginX,RabbitY=100;//兔子的起點(diǎn)intTortoiseX=BeginX,TortoiseY=200;〃烏龜?shù)钠瘘c(diǎn)intRabbitRestTime=800,TortoiseRestTime=50;〃各自休息時(shí)間intRabbitSpeed=15,TortoiseSpeed=1;//各自速度intstate=0;//比賽狀態(tài),0代表比賽進(jìn)行中,1代表兔子贏,2代表烏龜贏Thrcadrabbit;Threadtortoise;pub1icvoidinit(){rabbit=newThread(this,“rabbit");〃創(chuàng)建名為rabit的線程tortoise=newThread(this,ortoise");〃創(chuàng)建名為tortoise的線程)publicvoidpaint(Graphiesg){g.drawString("龜",TortoiseX,TortoiseY);g.drawString(〃兔〃,RabbitX,RabbitY);g.setCo1or(Color,red);for(intj=70;j<=230;j+=l0)g.drawstring(T,EndX+8,j);//繪制終點(diǎn)線g.setColor(Co1or.black);if(state==l)g.drawString(“兔子贏了!!“,250,300);elseif(state==2)g.drawString("烏龜贏了!!250,300);)publicvoidstart(){rabbit.start();

tortoise.start();)publicvoidrun(){StringcurrentRunning;whi1e(state==0){currentRunning=Thread.currentThread().getName();//得到當(dāng)前線程的名程if(currentRunning.equa1s("rabbit*)){//是兔子try{Thread,s1eep((int)(Math,random()*RabbitRestTime));)catch(InterruptedExceptione){}RabbitX+=RabbitSpeed;if(RabbitX>EndX)RabbitX=EndX;}elseif(currentRunning.equals("lorloise"))(〃是烏龜try{Thread.s1eep((int)(Math.random()*TortoiseRestTime));)catch(InterruptedExceptione){}TortoiseX+=TortoiseSpeed;if(TortoiseX>EndX)TortoiseX=EndX;)if(RabbitX==EndX)state=l;elseif(TortoiscX==EndX)state=2;repaint();)))【編程技巧】(1)創(chuàng)建兩個(gè)代表兔子和烏龜?shù)木€程,根據(jù)線程名決定各自的速度和休息時(shí)間。(2)根據(jù)是否到達(dá)終點(diǎn)決定state值的變化;(3)線程的run方法內(nèi)的循環(huán)條件是state值為0。樣例2:編寫選號(hào)程序,在窗體中安排6個(gè)標(biāo)簽,每個(gè)標(biāo)簽上顯示。?9之間的一位數(shù)字,每位數(shù)字用一個(gè)線程控制其變化,點(diǎn)擊“停止”按鈕則所有標(biāo)簽數(shù)字停止變化?!緟⒖汲绦颉縤n^>ortjava,awt.*;importjava.awt.event.*;publicc1assMyFramee

溫馨提示

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