生產(chǎn)者與消費(fèi)者_(dá)第1頁
生產(chǎn)者與消費(fèi)者_(dá)第2頁
生產(chǎn)者與消費(fèi)者_(dá)第3頁
生產(chǎn)者與消費(fèi)者_(dá)第4頁
生產(chǎn)者與消費(fèi)者_(dá)第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、重 慶 交 通 大 學(xué)計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)報(bào)告班級(jí):計(jì)軟專業(yè)2013級(jí)2班姓名:學(xué)號(hào):課程設(shè)計(jì)題目:生產(chǎn)者/消費(fèi)者與FCFS所屬課程:計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)室(中心):語音大嘍801指導(dǎo)教師:劉洋完成時(shí)間:2015 年 12 月 5 日信息科學(xué)與工程學(xué)院課程設(shè)計(jì)成績單課程名稱:計(jì)算機(jī)操作系統(tǒng)指導(dǎo)教師:劉洋姓名劉沅良性別男學(xué)號(hào)631306050202班級(jí)軟件1302綜合成績程序運(yùn)行情況能正確運(yùn)行基本能正確運(yùn)行能運(yùn)行但結(jié)果不完善(占總成績20%(20 分)(15 分)(10 分)程序功能完善程度完善基本完善不完善(占總成績10%(10 分)(8分)(5分)程序結(jié)構(gòu)的合理性合理基本合理不太合理(占總成

2、績10%(10 分)(8分)(5分)概念正確有創(chuàng)新 能正確回答所有問題基本能正確回答對(duì)問題的答辯情況(40 分)(35 分)(30 分)(占總成績40%部分問題回答概念不清晰(20 分)學(xué)生的工作態(tài)度與工作態(tài)度認(rèn)真能獨(dú)立完成任務(wù)工作態(tài)度認(rèn)真但獨(dú)立性較差獨(dú)立工作能力(10 分)(8分)(占總成績10%工作態(tài)度基本認(rèn)真但缺之獨(dú)立性(5分)設(shè)計(jì)報(bào)-告的規(guī)范性符合規(guī)范基本符合規(guī)范規(guī)范性較差(占總成績10%(10 分)(8分)(5分)重慶交通學(xué)院信息科學(xué)與工程學(xué)院課程設(shè)計(jì)任務(wù)書課程計(jì)算機(jī)操作系統(tǒng)班級(jí)軟件2013級(jí)2班 指導(dǎo)教師劉洋題目生產(chǎn)者/消費(fèi)者與FCFS完成時(shí)間2015年6月30日 至2015年12

3、月8 日主要 內(nèi)容1.生產(chǎn)者與消費(fèi)者問題;2 .先來先服務(wù)問題。設(shè)計(jì)報(bào) 告要求1.封面;2 課程設(shè)計(jì)成績單、課程設(shè)計(jì)任務(wù)書3內(nèi)容提要;4“課程設(shè)計(jì)報(bào)告”正文部分:主要應(yīng)包括: 問題分析和任務(wù)定義; 環(huán)境簡介; 設(shè)計(jì):主要是指數(shù)據(jù)結(jié)構(gòu)與核心算法的設(shè)計(jì)描述;操作界面的設(shè)計(jì);主要 功能的算法框架;測試用例設(shè)計(jì)等內(nèi)容。 編譯參數(shù)與步驟的說明; 上機(jī)調(diào)試總結(jié)與分析; 用戶使用說明; 測試數(shù)據(jù)與測試結(jié)果等內(nèi)容。 課程設(shè)計(jì)總結(jié):可以包括課程設(shè)計(jì)過程的收獲、遇到的問題及解決過程的 思考、對(duì)數(shù)據(jù)結(jié)構(gòu)這門課程的思考和認(rèn)識(shí)等內(nèi)容。 附錄程序清單5.參考文獻(xiàn)版面要 求1. 題目用黑體三號(hào),段后距18磅(或1行),居中

4、對(duì)齊;2. 標(biāo)題用黑體四號(hào),段前、段后距6磅(或0.3行);3. 正文用小四號(hào)宋體,行距為 1.25倍行距;4標(biāo)題按“一”、“”、“1”、“”順序編號(hào)。指導(dǎo)時(shí) 間安排星期周次、-一一二二二-三四五六17周18周指導(dǎo) 地點(diǎn)語音大樓801生產(chǎn)者/消費(fèi)者與FCFS一、內(nèi)容提要操作系統(tǒng)是計(jì)算機(jī)的核心軟件,是計(jì)算機(jī)專業(yè)學(xué)生的專業(yè)必修課。進(jìn)程同步 問題是計(jì)算機(jī)操作系統(tǒng)中的重點(diǎn)內(nèi)容,而生產(chǎn)者 -消費(fèi)者問題是進(jìn)程同步問題中 的經(jīng)典,它是計(jì)算機(jī)中相互合作進(jìn)程關(guān)系的一種抽象,該問題具有很大的代表性 和使用價(jià)值。在計(jì)算機(jī)系統(tǒng)中,很多問題都可以歸結(jié)為生產(chǎn)者與消費(fèi)者問題,提別是在通 訊和控制系統(tǒng)中。因此,對(duì)該類問題的研

5、究是非常必要的。一般而言,我們把提 供給某種資源的進(jìn)程(線程)稱之為生產(chǎn)者,二吧消耗資源的進(jìn)程(線程)稱之 為消費(fèi)者。在大多數(shù)情況下,生產(chǎn)者和消費(fèi)者的數(shù)目都是多于一個(gè)的。 下面以多 個(gè)進(jìn)程(線程)共享一有界緩沖池為例來說明。123n-2n-1n如圖,左端箭頭表示生產(chǎn)者,右端箭頭表示消費(fèi)者,設(shè)Pi、P2、Pk是k個(gè)想緩沖池裝入數(shù)據(jù)的進(jìn)程(線程)(生產(chǎn)者)C、C2、Cm是 m個(gè)沖緩沖池中取出數(shù)據(jù)進(jìn)行處理的進(jìn)程(線程)(消費(fèi)者),假設(shè)對(duì)任何P每次向緩沖區(qū)中申請(qǐng)一空白緩沖區(qū),并把數(shù)據(jù)裝入其中;而對(duì)于常見的情況是任何C每次都從緩沖池中取出一滿緩沖區(qū)的內(nèi)容, 并進(jìn)行相應(yīng)的處理,并把緩沖區(qū)清空。而每 次生產(chǎn)

6、者裝入數(shù)據(jù)和消費(fèi)者取出數(shù)據(jù)都是相同的(這是最常見的情況)。針對(duì)以 上進(jìn)程(線程)通信,如不對(duì)生產(chǎn)者進(jìn)程(線程)和消費(fèi)者(線程)的操作進(jìn)行 限制,則可能破壞數(shù)據(jù)的完整性。一種情況是一個(gè)生產(chǎn)者進(jìn)程(線程)正在裝入 數(shù)據(jù)到緩沖區(qū)時(shí),另外的生產(chǎn)者進(jìn)程(線程)可能同時(shí)把數(shù)據(jù)寫入相同區(qū)域,造 成數(shù)據(jù)破壞,另一種情況是一個(gè)生產(chǎn)者進(jìn)程(線程)正在裝入數(shù)據(jù)到緩沖區(qū)時(shí), 另外的消費(fèi)者進(jìn)程(線程)可能讀入該區(qū)域數(shù)據(jù),由于數(shù)據(jù)未寫完,從而造成消 費(fèi)者讀到的數(shù)據(jù)是不完整的。對(duì)于先來先服務(wù),如果早就緒的進(jìn)程排在就緒隊(duì)列的前面, 遲就緒的進(jìn)程排 在就緒隊(duì)列的后面,那么先來先服務(wù)總是把當(dāng)前處于就緒隊(duì)列之首的那個(gè)進(jìn)程調(diào) 度到運(yùn)

7、行狀態(tài)。也就是說,它只考慮進(jìn)程進(jìn)入就緒隊(duì)列的先后,而不考慮它的下 一個(gè)CPU的長短及其他因素。二、正文(一)問題分析和任務(wù)定義1、生產(chǎn)者 / 消費(fèi)者(1) 生產(chǎn)者與消費(fèi)者之間的關(guān)系問題。作為消費(fèi)者(Pl、P2、Pk)它每次都 需要消耗緩沖池中空白緩沖區(qū);而消費(fèi)者( c、C2、cm)它每次都需要消耗 緩沖池中的滿緩沖區(qū), 并給緩沖池中提供空白緩沖區(qū)。 因此,生產(chǎn)者群體和消費(fèi) 者之間首先存在同步問題。 為了提高系統(tǒng)的效率, 也就是說有生產(chǎn)者正在裝入數(shù) 據(jù)到空白數(shù)據(jù)緩沖區(qū)時(shí), 消費(fèi)者可以提取已經(jīng)裝滿數(shù)據(jù)的滿緩沖區(qū), 因此,生產(chǎn) 者和消費(fèi)者之間可以不應(yīng)該存在互斥關(guān)系。(2) 生產(chǎn)者(R、P2、R)群體

8、內(nèi)部的關(guān)系問題:當(dāng)有生產(chǎn)者 P正在裝入數(shù) 據(jù)時(shí),如果這時(shí)又有生產(chǎn)者 Pj 到達(dá),如允許其也進(jìn)行裝入數(shù)據(jù)工作,則有可能 導(dǎo)致數(shù)據(jù)裝入同一緩沖區(qū),造成數(shù)據(jù) 丟失,因此,必須讓所有生產(chǎn)者以互斥方 式對(duì)緩沖區(qū)進(jìn)行操作。(3) 消費(fèi)者(C、Q、G)群體內(nèi)部的關(guān)系問題。當(dāng)有消費(fèi)者 C正在取出數(shù) 據(jù)時(shí),如果這時(shí)又有消費(fèi)者 Cj 到達(dá),如果允許其取出數(shù)據(jù)工作,則有可可能導(dǎo) 致同一緩沖區(qū)多次取用, 這也是不能允許的, 因?yàn)橐粋€(gè)數(shù)據(jù)只能使用一次。 因此, 必須讓所有消費(fèi)者以互斥方式對(duì)緩沖池進(jìn)行操作。2、FCFS先來先服務(wù)算法按照作業(yè)進(jìn)入系統(tǒng)后備作業(yè)隊(duì)列的先后次序挑選作業(yè) , 先進(jìn) 入系統(tǒng)的作業(yè)將優(yōu)先被挑選進(jìn)入主存

9、 ,創(chuàng)建用戶進(jìn)程 ,分配所需資源 , 然后, 移入 就緒隊(duì)列.這是一種非剝奪式調(diào)度算法 ,易于實(shí)現(xiàn),但效率不高 .只顧及作業(yè)的等 候時(shí)間 , 未考慮作業(yè)要求服務(wù)時(shí)間的長短 , 不利于短作業(yè)而優(yōu)待長作業(yè) ,不利于 I/O繁忙型作業(yè)而有利于CPI繁忙型作業(yè).有時(shí)為了等待場作業(yè)執(zhí)行結(jié)束,短作業(yè) 的周轉(zhuǎn)時(shí)間和帶全周轉(zhuǎn)時(shí)間將變得很大 , 從而若干作業(yè)的平均周轉(zhuǎn)時(shí)間和平均帶 權(quán)周轉(zhuǎn)時(shí)間也變得很大。二)環(huán)境簡介Win dows系統(tǒng)電腦一臺(tái);JDK環(huán)境下用EditPlus軟件編寫程序。三)設(shè)計(jì)1、生產(chǎn)者 / 消費(fèi)者(1) 數(shù)據(jù)結(jié)構(gòu)與核心算法描述 Storage 類模擬緩沖池,包含數(shù)據(jù)成員如下:private

10、int pnumber;/生產(chǎn)商品數(shù)private int cnumber;/消耗商品數(shù)private int number;/緩沖區(qū)商品數(shù)private boolean flag1;/private boolean flag2;/private boolean flag3;/private boolean flag4;/包含的方法如下:public void setPNumber(int pnumber)/獲取當(dāng)前生產(chǎn)的商品數(shù)public void setCNumber(int cnumber)/或取當(dāng)前消耗的商品數(shù)public int countNumber()/ 庫存量(生產(chǎn)數(shù)量 - 消

11、費(fèi)數(shù)量) public void setStorageBallFlag()/public boolean getFlag1()public boolean getFlag2()public boolean getFlag3() 生產(chǎn)者Productor類并實(shí)現(xiàn)接口 Runnable,包含的數(shù)據(jù)成員如下:private Storage storage;/ 倉庫private MyCanvas mycanvas;/ 畫圖包含的方法如下:public void run()/run 方法中調(diào)用 product ()方法進(jìn)行生產(chǎn)throwsthrowspublic void product(Storag

12、e storage,MyCanvas mycanvas)InterruptedException/ 生產(chǎn)商品,并進(jìn)行相應(yīng)的畫圖 消費(fèi)者Customer類并實(shí)現(xiàn)接口 Runnable,包含的數(shù)據(jù)成員如下:private Storage storage; / 倉庫 private MyCanvas mycanvas; / 畫圖包含的方法如下:public void run()/run 方法中調(diào)用 cast ()方法進(jìn)行生產(chǎn)public void cast(Storage storage,MyCanvas mycanvas)InterruptedException/ 生產(chǎn)商品,并進(jìn)行相應(yīng)的畫圖(2)

13、 操作界面的設(shè)計(jì)MyFrame類進(jìn)行界面的搭建,包含的數(shù)據(jù)成員如下: private JFrame myframe;/private Button pbutto n;/生產(chǎn)者按鈕private Button cbutt on;/消費(fèi)者按鈕private MyCa nvas myca nv as;/ 軌道 private Storage storage;/倉庫對(duì)象界面寬度界面長度public MyFrame()完成界面的private fi nal int TABLE_WIDTH = 400;/ private fi nal int TABLE_HEIGHT = 300;/ 其中,為按鈕添加事件

14、監(jiān)聽器。由構(gòu)造函數(shù) 搭建。界面圖如下:(3) 主要功能算法描述點(diǎn)擊生產(chǎn)按鈕,進(jìn)行模擬生產(chǎn),若倉庫滿則停止生產(chǎn) 點(diǎn)擊消費(fèi)按鈕,進(jìn)行模擬消費(fèi),若倉庫空則停止消費(fèi)2、FCFS(1)數(shù)據(jù)結(jié)構(gòu)與核心算法描述核心算法如下:class TBall1 implements Runnableclass TBall2 implements Runnableclass TBall3 implements Runnableclass TBall4 implements Runnable 以上四個(gè)方法對(duì)小球進(jìn)行控制,先到的先進(jìn)入 CPU。(2)操作界面的設(shè)計(jì)View 類進(jìn)行界面的搭建,包含的數(shù)據(jù)成員如下:private

15、 JFrame f = new JFrame(" 先來先服務(wù) -631306050202-劉沅良 ");private final int T = 200;private final int TABLE_WIDTH = 400;/寬度private final int TABLE_HEIGHT = 300; /長度private final int BALL_SIZE = 20;/球的直徑private MyCanvas mc = new MyCanvas();/ 球的軌道控制 FlowLayout flow = new FlowLayout();private Butto

16、n start = new Button("開始 ");Queue<String> queue = new LinkedList<String>();private boolean flag1 = true;/控制小球進(jìn)入 CPUprivate boolean flag2 = true;private boolean flag3 = true;private boolean flag4 = true;private int b_v = 10;private int b1_v = 1+(int)(Math.random()*10);/小球的速度 , 用

17、隨機(jī)數(shù)產(chǎn)生private int b2_v = 1+(int)(Math.random()*10);private int b3_v = 1+(int)(Math.random()*10);private int b4_v = 1+(int)(Math.random()*10);private int b1_x = 50;/ 小球一橫坐標(biāo)private int b2_x = 50;private int b3_x = 50;private int b4_x = 50;private int b1_y = 50;private int b2_y = 100;private int b3_y =

18、150;private int b4_y = 200;其中,為按鈕添加事件監(jiān)聽器。由構(gòu)造函數(shù)public View()完成界面的搭建界面圖如下:(3)主要功能算法描述點(diǎn)擊開始,四個(gè)小球以不同的速度向前移動(dòng),用隊(duì)列進(jìn)行存儲(chǔ),先到的先入 隊(duì),利用隊(duì)列先進(jìn)先出的特點(diǎn)。(四) 編譯參數(shù)與步驟1、生產(chǎn)者/消費(fèi)者2、FCFS(五)上機(jī)調(diào)試總結(jié)與分析1、生產(chǎn)者/消費(fèi)者岡寸開始時(shí)基本語法問題,改了以后出現(xiàn)的問題是倉庫滿了還可以繼續(xù)生產(chǎn), 以及倉庫空的時(shí)候還可以繼續(xù)消費(fèi),這是不允許,分析后發(fā)現(xiàn)沒有在生產(chǎn)和消費(fèi) 時(shí)加以控制。2、FCFS一開始的是并不能實(shí)現(xiàn)先來先服務(wù)的條件, 球到了模擬緩沖區(qū)以后沒有按照 順序進(jìn)入

19、CPU分析之后使用了隊(duì)列來實(shí)現(xiàn)。(六)用戶使用說明1、生產(chǎn)者/消費(fèi)者點(diǎn)擊生產(chǎn)按鈕,進(jìn)行模擬生產(chǎn),若倉庫滿則停止生產(chǎn) 點(diǎn)擊消費(fèi)按鈕,進(jìn)行模擬消費(fèi),若倉庫空則停止消費(fèi)2、FCFS點(diǎn)擊開始,四個(gè)小球以不同的速度向前移動(dòng),用隊(duì)列進(jìn)行存儲(chǔ),先到的先入 隊(duì),利用隊(duì)列先進(jìn)先出的特點(diǎn)。先到緩沖區(qū)先進(jìn)入 CPU(七)測試數(shù)據(jù)與測試結(jié)果1、生產(chǎn)者/消費(fèi)者(八)課程設(shè)計(jì)總結(jié)通過這次課程設(shè)計(jì),讓我對(duì)資源共享有了更深一步的了解,同時(shí)對(duì)線程的理解比以前更熟了一些,而且,在FCFS中,讓我對(duì)進(jìn)程作業(yè)先來先服務(wù)調(diào)度概念, 有了更深入的認(rèn)識(shí)。初步理解了操作系統(tǒng)對(duì)于作業(yè)處理的基本思想。同時(shí),這次 課程設(shè)計(jì)也是對(duì)自己編程能力的一種

20、考驗(yàn),加深了理論知識(shí)的實(shí)際應(yīng)用。但還是暴露出對(duì)java語言不熟練的缺點(diǎn),希望在以后的學(xué)習(xí)中能夠?qū)W好,逐步增強(qiáng)自 己的編程能力。(九)附錄1、生產(chǎn)者/消費(fèi)者代碼/程序功能:生產(chǎn)者消費(fèi)者模擬import javax.swi ng.*;import java.awt.*;import java.awt.eve nt.*;class MyFrame exte nds JFrameprivate JFrame myframe;private Button pbutton;private Button cbutton;private MyCanvas mycanvas;private Storage st

21、orage;private final int TABLE_WIDTH = 400;private final int TABLE_HEIGHT = 300;public MyFrame()myframe=new JFrame("生產(chǎn)者消費(fèi)者-631306050202-劉沅良");pbutton=new Button(" 生產(chǎn)");cbutton=new Button(" 消費(fèi) ");storage=new Storage();mycanvas=new MyCanvas(storage);mycanvas.setPreferredSi

22、ze(newDimension(TABLE_WIDTH,TABLE_HEIGHT); myframe.add(pbutton,BorderLayout.NORTH); myframe.add(cbutton,BorderLayout.SOUTH); myframe.add(mycanvas);myframe.pack();pbutton.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)new Thread(new Productor(storage,mycanvas).start()

23、;);/ 按鈕事件響應(yīng)cbutton.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)new Thread(new Customer(storage,mycanvas) ).start(););myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);myframe.setVisible(true);class Storageprivate int pnumber;/商品數(shù)private int cnumber;private in

24、t number;private boolean flag1;private boolean flag2;private boolean flag3;private boolean flag4;public Storage()pnumber=0;cnumber=0;number=0;flag1=false;flag2=false;flag3=false;flag4=false;public void setPNumber(int pnumber)this.pnumber=pnumber;public void setCNumber(int cnumber)this. cnumber=cnumb

25、er;public int countNumber()this.number=pnumber-cnumber;return number;public void setStorageBallFlag()if(countNumber()= 0)flag1 = false;flag2 = false;flag3 = false;if(countNumber() = 1)flag1 = true;flag2 = false;flag3 = false;if(countNumber() = 2)flag1 = true;flag2 = true;flag3 = false;if(countNumber

26、() = 3)flag1 = true;flag2 = true;flag3 = true;public boolean getFlag1()return flag1;public boolean getFlag2()return flag2;public boolean getFlag3()return flag3;class MyCanvas extends Canvasprivate final int BALLSIZE;private int ballx;private int bally;Storage storage;public MyCanvas(Storage storage)

27、BALLSIZE=30;ballx=50;bally=50;this.storage=storage;public void paint(Graphics mygraphics)mygraphics.setColor(Color.BLUE);mygraphics.drawRect(50, 50, 150, 30);mygraphics.drawRect(200, 200, 150, 30);/ 定義一個(gè)生產(chǎn)道和一個(gè) 消費(fèi)道m(xù)ygraphics.setColor(Color.RED);mygraphics.fillOval(ballx, bally, BALLSIZE, BALLSIZE); m

28、ygraphics.setColor(Color.BLUE);mygraphics.drawRect(155, 135, 90, 30); storage.setStorageBallFlag(); if(storage.getFlag1() = true) mygraphics.setColor(Color.YELLOW); mygraphics.fillOval(155, 135, BALLSIZE, BALLSIZE);if(storage.getFlag2() = true) mygraphics.setColor(Color.YELLOW); mygraphics.fillOval(

29、185, 135, BALLSIZE, BALLSIZE); if(storage.getFlag3() = true) mygraphics.setColor(Color.YELLOW); mygraphics.fillOval(215, 135, BALLSIZE, BALLSIZE);public void setPBallLocus(int ballx, int bally)try Thread.sleep(400);catch (InterruptedException e) e.printStackTrace();this.ballx = ballx;this.bally = ba

30、lly; this.repaint();public void setCBallLocus(int ballx, int bally)try Thread.sleep(400);catch (InterruptedException e) e.printStackTrace();this.ballx = ballx;this.bally = bally; this.repaint();class Productor implements Runnable/private Productors productors;private Storage storage;private MyCanvas

31、 mycanvas;public Productor(Storage storage,MyCanvas mycanvas)/ductors=productors;this.storage=storage;this.mycanvas=mycanvas;public void run()tryproduct(storage,mycanvas);catch (InterruptedException e)e.printStackTrace();throwspublic void product(Storage storage,MyCanvas mycanvas) Interrupte

32、dExceptionfor(int j = 0; j < 100; j+)while(storage.countNumber()=3)trystorage.wait();catch (InterruptedException e)e.printStackTrace();System.out.println("第" + (j+1) + " 次生產(chǎn)" );for(int i = 0; i < 9; i+ )mycanvas.setPBallLocus(50 + i * 15, 50);storage.setPNumber(j + 1);stora

33、ge.notifyAll();class Customer implements Runnableprivate Storage storage;private MyCanvas mycanvas;public Customer(Storage storage,MyCanvas mycanvas)this.storage=storage;this.mycanvas=mycanvas;public void run()trycast(storage,mycanvas);catch (InterruptedException e)e.printStackTrace();public void ca

34、st(Storage storage,MyCanvas mycanvas)throws InterruptedExceptionfor(int j = 0; j < 100; j+) while(storage.countNumber()<=0) try storage.wait();catch (InterruptedException e) e.printStackTrace();System.out.println("第 " + (j+1) +" 次消費(fèi) ");for(int i = 0; i < 9; i+) mycanvas.

35、setCBallLocus(200 + i * 15, 200); storage.setCNumber(j + 1); storage.notifyAll();public class MyProgrampublic static void main(String args)MyFrame myprogram=new MyFrame();2、FCFS代碼import javax.swing.*;import java.awt.Button;import java.awt.Canvas;import java.awt.Color;import java.awt.Dimension;import

36、 java.awt.FlowLayout;import java.awt.Frame;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.LinkedList;import java.util.Queue;class Viewprivate JFrame f = new JFrame(" 先來先服務(wù) -631306050202- 劉沅良 "); private final int T = 200;pri

37、vate final int TABLE_WIDTH = 400;private final int TABLE_HEIGHT = 300;private final int BALL_SIZE = 20;private MyCanvas mc = new MyCanvas();FlowLayout flow = new FlowLayout();private Button start = new Button("開始 ");Queue<String> queue = new LinkedList<String>();private boolean

38、 flag1 = true;private boolean flag2 = true;private boolean flag3 = true;private boolean flag4 = true;/private boolean msg = true; private int b_v = 10;private int b1_v = 1+(int)(Math.random()*10);/ 小球的速度 , 用隨機(jī)數(shù)產(chǎn)生private int b2_v = 1+(int)(Math.random()*10);private int b3_v = 1+(int)(Math.random()*10

39、);private int b4_v = 1+(int)(Math.random()*10);private int b1_x = 50;/小球一橫坐標(biāo)private int b2_x = 50;private int b3_x = 50;private int b4_x = 50;private int b1_y = 50;private int b2_y = 100;private int b3_y = 150;private int b4_y = 200;public View()mc.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HE

40、IGHT); f.add(mc);f.setLayout( flow);f.add(start);f.pack(); start.addActionListener(new ActionListener()/ 按鈕事件監(jiān)聽器Override public void actionPerformed(ActionEvent e)new Thread(new TBall1().start();new Thread(new TBall2().start();new Thread(new TBall3().start();new Thread(new TBall4().start();); f.setD

41、efaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true);public void setBALL1(int b1_x, int b1_y)try Thread.sleep(200);catch (InterruptedException e)e.printStackTrace();this.b1_x = b1_x;this.b1_y = b1_y;mc.repaint();public void setBALL2(int b2_x, int b2_y) tryThread.sleep(200); catch (Interrup

42、tedException e)e.printStackTrace();this.b2_x = b2_x;this.b2_y = b2_y;mc.repaint();public void setBALL3(int b3_x, int b3_y) tryThread.sleep(200);catch (InterruptedException e)e.printStackTrace();this.b3_x = b3_x;this.b3_y = b3_y; mc.repaint();public void setBALL4(int b4_x, int b4_y) tryThread.sleep(2

43、00);catch (InterruptedException e)e.printStackTrace();this.b4_x = b4_x;this.b4_y = b4_y; mc.repaint();class TBall1 implements RunnableOverridepublic void run()for(int i = 0; i < T; i+)b1_x = b1_x + b1_v; setBALL1(b1_x,b1_y); if(flag1 = true)if(b1_x >= 190)flag1 = false;queue.add("A")

44、;b1_v = 0;if( queue.peek() = "A" && b1_x >= 190)b1_v = 10;b1_y = 140;if(b1_x >= 330)System.out.println(queue.poll(); b1_v = 0;break;class TBall2 implements RunnableOverridepublic void run()for(int i = 0; i < T; i+)b2_x = b2_x + b2_v; setBALL2(b2_x,b2_y); if(flag2 = true) if(b2_x >= 190) flag2 = false; queue.add("

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論