操作系統(tǒng)實驗_第1頁
操作系統(tǒng)實驗_第2頁
操作系統(tǒng)實驗_第3頁
操作系統(tǒng)實驗_第4頁
操作系統(tǒng)實驗_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、南京工程學院上機實 驗 報 告 課 程 名 稱: 操作系統(tǒng) 實驗項目名稱: 基于線程的編程技術 學生班級: 數(shù)字媒體143 學生學號: 202140703 學生姓名: 汲靜 指導教師: 彭煥峰 實 驗 時 間: 實 驗 地 點: 信息樓專業(yè)機房 實驗成績評定: 2016-2017-1學期一、實驗目的及要求熟悉基于多線程的編程技術,編程實現(xiàn)簡單的多線程編程實例。要求采用Java等某一種編程語言實現(xiàn)2個多線程編程實例。二、實驗相關知識簡介線程是近年來操作系統(tǒng)領域出現(xiàn)的一個非常重要的機制和技術,其重要程度不亞于進程。線程機制可以提高程序執(zhí)行的效率,而且也方便用戶編程,不但適用于多機系統(tǒng),對大多數(shù)單C

2、PU的個人計算機也同樣帶來好處,因此當代操作系統(tǒng)都支持線程。在操作系統(tǒng)中,進程的引入提高了計算機資源的利用效率。但在進一步提高進程的并發(fā)性時,人們發(fā)現(xiàn)進程切換開銷占的比重越來越大。傳統(tǒng)的進程不能很好的利用多處理器,因為一個進程在某個時刻只能使用一個處理器,進程間通信的效率受到限制。引入線程的目的:減?。ㄟM程/線程)上下文切換開銷;更好支持多處理器,達到最大程度的并行;簡化進程間的通信。 三、關鍵程序代碼分析(一) 程序11. 問題描述答:啟動3個線程打印遞增的數(shù)字, 線程1先打印1,2,3,4,5, 然后是線程2打印6,7,8,9,10, 然后是線程3打印11,12,13,14,15. 接著再

3、由線程1打印16,17,18,19,20.以此類推, 直到打印到302. 關鍵代碼分析答:package lalala;public class NumberPrintDemo / n為即將打印的數(shù)字 private static int n = 1; / state=1表示將由線程1打印數(shù)字, state=2表示將由線程2打印數(shù)字, state=3表示將由線程3打印數(shù)字 private static int state = 1; public static void main(String args) final NumberPrintDemo pn = new NumberPrintDem

4、o(); new Thread(new Runnable() public void run() / 3個線程打印75個數(shù)字, 單個線程每次打印5個連續(xù)數(shù)字, 因此每個線程只需執(zhí)行5次打印任務. 3*5*5=75 for (int i = 0; i < 2; i+) / 3個線程都使用pn對象做鎖, 以保證每個交替期間只有一個線程在打印 synchronized (pn) / 如果state!=1, 說明此時尚未輪到線程1打印, 線程1將調用pn的wait()方法, 直到下次被喚醒 while (state != 1) try pn.wait(); catch (InterruptedE

5、xception e) e.printStackTrace(); / 當state=1時, 輪到線程1打印5次數(shù)字 for (int j = 0; j < 5; j+) / 打印一次后n自增 System.out.println(Thread.currentThread().getName() + ": " + n+); System.out.println(); / 線程1打印完成后, 將state賦值為2, 表示接下來將輪到線程2打印 state = 2; / notifyAll()方法喚醒在pn上wait的線程2和線程3, 同時線程1將退出同步代碼塊, 釋放pn

6、鎖. / 因此3個線程將再次競爭pn鎖 / 假如線程1或線程3競爭到資源, 由于state不為1或3, 線程1或線程3將很快再次wait, 釋放出剛到手的pn鎖. / 只有線程2可以通過state判定, 所以線程2一定是執(zhí)行下次打印任務的線程. / 對于線程2來說, 獲得鎖的道路也許是曲折的, 但前途一定是光明的. pn.notifyAll(); , "線程1").start(); new Thread(new Runnable() public void run() for (int i = 0; i < 5; i+) synchronized (pn) while

7、 (state != 2) try pn.wait(); catch (InterruptedException e) e.printStackTrace(); for (int j = 0; j < 5; j+) System.out.println(Thread.currentThread().getName()+ ": " + n+); System.out.println(); state = 3; pn.notifyAll(); , "線程2").start(); new Thread(new Runnable() public void

8、 run() for (int i = 0; i < 5; i+) synchronized (pn) while (state != 3) try pn.wait(); catch (InterruptedException e) e.printStackTrace(); for (int j = 0; j < 5; j+) System.out.println(Thread.currentThread().getName()+": "+ n+); System.out.println(); state = 1; pn.notifyAll(); , "

9、;線程3").start(); (二)龜兔賽跑(例如:讀者-寫者問題)1. 問題描述答:創(chuàng)建兩個線程,實現(xiàn)龜兔賽跑,線程每次執(zhí)行休眠500毫秒,兩個線程每次分別執(zhí)行烏龜前行10米與兔子前行10米。一方先到100米處結束程序,顯示獲勝信息。2. 關鍵代碼分析 package competition public class GuiTuSaiPao implements Runnable private String name; private int length=0; public GuiTuSaiPao() public GuiTuSaiPao(String name) this.

10、name=name; public void run() while(true) /每次停500毫秒 try Thread.sleep(500); catch (InterruptedException e) e.printStackTrace(); /向前跑十米 length+=10; System.out.println(name+"已跑了"+length+"米."); /到達終點 if(length>=100) System.out.println(name+",已經到達終點!"); /結束賽跑,break break; public static void main(String args) GuiTuSaiPao wugui=new GuiTuSaiPao("烏龜"); GuiTuSaiPao tuzi=new GuiTuSaiPao("兔子"); Thread thread=new Thread(wugui); Thread thread2=new Thread(tuzi); /啟動線程 thread.start(); thread2.start(); 4、 運行結果說明:2個程序的運行截圖,并對執(zhí)行結果進行解釋。進程1: 進程2:五

溫馨提示

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

評論

0/150

提交評論