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

下載本文檔

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

文檔簡介

1、江蘇科技大學計算機科學與工程學院評定成績指導教師宋英磊實驗報告實驗課程:并行計算實驗名稱:Java多線程編程班級:學號:姓名:完成日期:2014年04月22日精選文庫精選文庫 實驗目的掌握多線程編程的特點;了解線程的調度和執行過程;掌握資源共享訪問的實現方法知識要點1.2.1線程的概念線程是程序中的一個執行流,多線程則指多個執行流;線程是比進程更小的執行單位,一個進程包括多個線程;Java語言中線程包括3部分:虛擬CPU、該CPU執行的代碼及代碼所操作的數據。Java代碼可以為不同線程共享,數據也可以為不同線程共享;線程的創建方式1:實現Runnable接口Thread類使用一個實現Runna

2、ble接口的實例對象作為其構造方法的參數,該對象提供了run方法,啟動Thread將執行該run方法;方式2:繼承Thread類重寫Thread類的run方法;線程的調度線程的優先級取值范圍110,在Thread類提供了3個常量,MIN_PRIORITY=1、MAX_PRIORITY=10、NORM_PRIORITY=5;用setPriority()設置線程優先級,用getPriority()獲取線程優先級;子線程繼承父線程的優先級,主線程具有正常優先級。線程的調度:米用搶占式調度策略,高優先級的線程優先執行,在Java中,系統按照優先級的級別設置不同的等待隊列。線程的狀態與生命周期緒狀態”,

3、處于就緒狀態的線程才有機會得到調度執行。線程在運行時也可能因資源等待或主動睡眠而放棄運行,進入“阻塞狀態”,線程執行完畢,或主動執行stop方法將進入“終止狀態”。1.2.5線程的同步-解決資源訪問沖突問題對象的加鎖所有被共享訪問的數據及訪問代碼必須作為臨界區,用synchronized加鎖。對象的同synchronized關鍵字的使用方法有兩種:用在對象前面限制一段代碼的執行,表示執行該段代碼必須取得對象鎖。在方法前面,表示該方法為同步方法,執行該方法必須取得對象鎖。wait()和notify()方法用于解決多線程中對資源的訪問控制問題。wait()方法:釋放對象鎖,將線程進入等待喚醒隊列;

4、notify()方法:喚醒等待資源鎖的線程,讓其進入對象鎖的獲取等待隊列。避免死鎖指多個線程相互等待對方釋放持有的鎖,并且在得到對方鎖之前不會釋放自己的鎖1.3上機測試下列程序樣例1:利用多線程編程編寫一個龜兔賽跑程序。烏龜:速度慢,休息時間短;兔子:速度快,休息時間長;參考程序1】字符方式下實現方案classAnimalextendsThreadintspeed;/速度publicAnimal(Stringstr,intspeed)super(str);/線程名用動物名代表this.speed=speed;publicvoidrun()intdistance=0;intsleepTime;w

5、hile(distance=1000)System.out.println(getName()+isat+distance);trydistance+=speed;/每次跑的距離簡單用速度計算sleepTime=(int)(speed+Math.random()*speed);/速度快休息時間要長sleep(sleepTime);catch(InterruptedExceptione)publicclassRacepublicstaticvoidmain(Stringarg)Animala1,a2;a1=newAnimal(rabit,100);a2=newAnimal(turtle,20);

6、a2.setPriority(Thread.MAX_PRIORITY);/讓烏龜的運行優先級更高a1.start();a2.start();編程技巧】14-3龜兔賽跑的團蕙方式運行界面速度快,跑的距離增加也快,這里簡單地將速度加到距離上,未考慮跑的時間;為了讓烏龜得到更多的運行機會,采取兩項措施,一讓線程的睡眠時間與速度成正比,二是讓烏龜得到更高的優先級。【參考程序2】一圖形方式下,圖14-3為程序的運行演示。publicclassrunnerextendsAppletimplementsRunnableintBeginX=10,EndX=200;/起點和終點的x坐標intRabbitX=Be

7、ginX,RabbitY=100;/兔子的起點intTortoiseX=BeginX,TortoiseY=200;/烏龜的起點intRabbitRestTime=800,TortoiseRestTime=50;/各自休息時間intRabbitSpeed=15,TortoiseSpeed=1;/各自速度intstate=0;/比賽狀態,0代表比賽進行中,1代表兔子贏,2代表烏龜贏Threadrabbit;Threadtortoise;publicvoidinit()rabbit=newThread(this,rabbit);/創建名為rabit的線程tortoise=newThread(this

8、,tortoise);/創建名為tortoise的線程publicvoidpaint(Graphicsg)g.drawString(龜,TortoiseX,TortoiseY);g.drawString(兔,RabbitX,RabbitY);g.setColor(Color.red);for(intj=70;jEndX)RabbitX=EndX;elseif(currentRunning.equals(tortoise)/是烏龜tryThread.sleep(int)(Math.random()*TortoiseRestTime);catch(InterruptedExceptione)Tor

9、toiseX+=TortoiseSpeed;if(TortoiseXEndX)TortoiseX=EndX;if(RabbitX=EndX)state=1;elseif(TortoiseX=EndX)state=2;repaint();【編程技巧】(1)創建兩個代表兔子和烏龜的線程,根據線程名決定各自的速度和休息時間。(2)根據是否到達終點決定state值的變化;線程的run方法內的循環條件是state值為0。樣例2:編寫選號程序,在窗體中安排6個標簽,每個標簽上顯示09之間的一位數字,每位數字用一個線程控制其變化,點擊“停止”按鈕則所有標簽數字停止變化。【參考程序】importjava.aw

10、t.*;importjava.awt.event.*;publicclassMyFrameextendsFrameMyLabelx=newMyLabel6;/安排6個標簽,每個標簽顯示1個數字Buttoncontrol;publicMyFrame(Stringtitle)super(title);PaneldispnewPanel();disp.setLayoutnewFlowLayout();for(inti=0;i6;i+)xi=newMyLabel();disp.adx(i);newThread(xi).start();addCenter,disp);control=newButton(

11、停止);addNorth,control);pack();setVisibletrue);control.addActionListener(newActionListener()publicvoidactionPerformed(ActionEvente)for(inti=0;i6;i+)xi.stop=true;);publicstaticvoidmain(Stringargs)newMyFrame(Test);classMyLabelextendsLabelimplementsRunnableintvalue;booleanstop=false;publicMyLabel()super(

12、number);value=0;publicvoidrun()for(;)value=(int)(Math.random()*10);/產生一個0到9的數字setText(Integert.oString(value);tryThreads.leep(500);catch(InterruptedExceptione)if(stop)/停止標記為true,退出循環,結束運行break;【編程技巧】將每個標簽定義為線程方式運行,在運行中利用隨機數產生數字顯示。線程體為一個循環語句,只有當stop標記變量為true,則停止;主程序中將所有標簽定義存入一個數組,這樣可以方便地對其進行控制,例如,在點擊

13、“停止”按鈕時將所有標簽對象的stop屬性值設置為true。1.4上機完成編程任務任務描述:完成下列編程任務,并將代碼與實驗報告一起交給教師。基本題(必做)編寫一個可變顏色的標簽,用一個按鈕控制顏色的改變與停止。點擊按鈕顏色停止變化,再點擊該按鈕顏色又變化。顏色的變化可用隨機數確定。有一個南北向的橋,只能容納一個人,現橋的兩邊分別有10人和12人,編制一個多線程序讓這些人到達對岸,每個人用一個線程表示,橋為共享資源。在過橋的過程中顯示誰在過橋及其走向。編寫一個圖片播放程序,圖片的文件名為file01.jpg,file02.jpg,filen.jpg,其中n由命令行輸入,要求用多線程自動播放。提

14、高題(選做其中一個)編制一個秒針計時器,在畫面包含一個文本框,顯示秒針值,安排一個“開始”和“結束”按鈕,點擊“開始”按鈕則開始計時,點擊“結束”停止計時。時間的確定可借助日歷對象實例方法實現,用get(Calendar.SECOND)方法得到秒值,用get(Calendar.MINUTE)方法得到分值,用get(Calendar.HOUR)方法得到小時值。計算從“開始”到“當前”的時間差即可確定花費的秒數。精選文庫精選文庫 【進一步思考】如何將秒針計時器設計為圖形界面,繪制一個圓形秒表,秒表的一圈為60秒,根據花費的時間顯示秒針的變化。編寫生產者/消費者問題的應用程序。生產者以0200ms的

15、速度隨機產生30個小寫字母,消費者以02s的速度取出字母,并顯示在屏幕上。利用多線程求解某范圍素數,每個線程負責10000范圍.線程1找1000-10000線程2找10001-20000線程3找20001-30000另開辟一線程專門接收其他線程發送給它的數據(創建管道輸入輸出流),直到3個線程發送的數據均結束(結束標記)為止,接受的數據以文本形式寫入到文件xyz.dat中。1.5思考題(必做)任務描述:完成實驗后,完成下列多選題什么原因可導致線程停止執行。有更高優先級的線程開始執行;線程調用了wait()方法;線程調用了yield()方法;線程調用了pause()方法;線程調用了sleep()

16、方法。哪個方法是實現Runnable接口所需的?Await()Brun()Cstop()Dupdate()Eresume()以下代碼的調試結果為?publicclassBgroundextendsThreadpublicstaticvoidmain(Stringargv)Bgroundb=newBground();b.run();publicvoidstart()for(inti=0;i10;i+)System.out.println(Valueofi=+i);編譯錯誤,沒有定義線程的run方法;由于沒有定義線程的run方法,而出現運行錯誤;編譯通過,運行輸出values0to9編譯通過,運行無輸出有關線程的敘述正確的有

溫馨提示

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

評論

0/150

提交評論