2023年并行計算實驗報告一_第1頁
2023年并行計算實驗報告一_第2頁
2023年并行計算實驗報告一_第3頁
2023年并行計算實驗報告一_第4頁
2023年并行計算實驗報告一_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

s1eep(s1eepTime);}catch(InterruptedExceptione){})))pub1icclassRace{pub1icstaticvoidmain(Stringarg[])(a1=newAnima1("rabit",100);a2=ncwAnimal("turtie”,20);a2.setPriority(Thread.MAX.PRIORITY);//讓烏龜?shù)倪\營優(yōu)先級更高a1.start();a2.start();))圖14-3龜兔賽跑的圖形方式運行界面圖14-3龜兔賽跑的圖形方式運行界面(1)速度快,跑的距離增長也快,這里簡樸地將速度加到距離上,未考慮跑的時間;(2)為了讓烏龜?shù)玫礁嗟倪\營機會,采用兩項措施,一讓線程的睡眠時間與速度成正比,二是讓烏龜?shù)玫礁叩膬?yōu)先級?!緟⒖汲绦?]一圖形方式下,圖14-3為程序的運營演示。pub1icc1assrunnerextendsAppletimplementsRunnable{intBeginX=10,EndX=200;〃起點和終點的x坐標(biāo)intRabbitX=BeginX,RabbitY=100;//兔子的起點intTortoiseX=BeginX,TortoiseY=200;〃烏龜?shù)钠瘘cintRabbitRestTime=800,TortoiseRestTime=50;〃各自休息時間intRabbitSpeed=15,TortoiseSpeed=1;//各自速度intstate=0;//比賽狀態(tài),0代表比賽進行中,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);//繪制終點線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)建兩個代表兔子和烏龜?shù)木€程,根據(jù)線程名決定各自的速度和休息時間。(2)根據(jù)是否到達(dá)終點決定state值的變化;(3)線程的run方法內(nèi)的循環(huán)條件是state值為0。樣例2:編寫選號程序,在窗體中安排6個標(biāo)簽,每個標(biāo)簽上顯示。?9之間的一位數(shù)字,每位數(shù)字用一個線程控制其變化,點擊“停止”按鈕則所有標(biāo)簽數(shù)字停止變化?!緟⒖汲绦颉縤n^>ortjava,awt.*;importjava.awt.event.*;publicc1assMyFramee

溫馨提示

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

評論

0/150

提交評論