例題金刁,哲學(xué)家用餐:
在一張餐桌上坐著五個(gè)哲學(xué)家辜王,但是卻只有五根筷子惫企,每個(gè)哲學(xué)家只有一根筷子撕瞧,所以當(dāng)一個(gè)哲學(xué)家要夾菜的時(shí)候需要用他旁邊那個(gè)哲學(xué)家的筷子,被拿走筷子的哲學(xué)家則只能等待那個(gè)哲學(xué)家吃完放下筷子他才能夾菜狞尔。
示意圖:
設(shè)計(jì)思路:首先編寫(xiě)一個(gè)筷子類(lèi)丛版,每根筷子都是一個(gè)對(duì)象,這個(gè)類(lèi)里有拿起沪么、放下兩個(gè)方法硼婿;當(dāng)一個(gè)哲學(xué)家線程來(lái)調(diào)用拿起方法時(shí),下一個(gè)哲學(xué)家線程就要進(jìn)入等待狀態(tài)禽车,然后這個(gè)哲學(xué)家線程調(diào)用放下方法后,就激活那個(gè)等待中的哲學(xué)家線程刊殉,以此循環(huán)殉摔,輪流使用筷子。
代碼示例:
接著設(shè)計(jì)哲學(xué)家類(lèi)记焊,這個(gè)類(lèi)繼承Thread類(lèi)逸月,每個(gè)哲學(xué)家都是一個(gè)線程對(duì)象。這類(lèi)有三個(gè)屬性遍膜,用于存放構(gòu)造器的參數(shù)碗硬,這個(gè)類(lèi)的構(gòu)造器要求傳遞三個(gè)參數(shù)瓤湘,分別是哲學(xué)家的名字(name)、右邊的筷子(right)恩尾、左邊的筷子(left)弛说。左右筷子的類(lèi)型都是筷子類(lèi)型,也就是需要傳遞兩個(gè)筷子對(duì)象翰意。然后遍寫(xiě)拿起和放下方法木人,這個(gè)兩個(gè)方法里分別調(diào)用著筷子類(lèi)的拿起、放下方法冀偶。在run方法里使用死循環(huán)調(diào)用拿起和放下方法醒第,并且使用sleep設(shè)置一個(gè)間隔時(shí)間。
代碼示例:
最后編寫(xiě)測(cè)試類(lèi)进鸠,測(cè)試類(lèi)里構(gòu)建五個(gè)筷子對(duì)象稠曼。然后構(gòu)建五個(gè)哲學(xué)家對(duì)象,分別傳遞相應(yīng)的參數(shù)客年。接著將哲學(xué)家對(duì)象使用start方法啟動(dòng)蒲列。
代碼示例:
運(yùn)行結(jié)果:
將這個(gè)例題升級(jí)為圖形化版: 先構(gòu)建出界面,將JPanel的背景顏色都設(shè)置為白色:
筷子類(lèi)不需要更改搀罢,哲學(xué)家類(lèi)則需要添一個(gè)JPanel類(lèi)型的屬性用來(lái)存放構(gòu)造器的參數(shù)蝗岖,構(gòu)造器加多一個(gè)JPanel類(lèi)型的參數(shù)。然后在拿起方法里設(shè)置JPanel的背景顏色為紅色榔至。在放下方法里則設(shè)置回白色抵赢。
代碼示例:
測(cè)試類(lèi)添加一個(gè)線程內(nèi)部類(lèi)來(lái)調(diào)用窗口類(lèi)的main方法。
代碼示例:
運(yùn)行結(jié)果:
定時(shí)器類(lèi): Timer定時(shí)器類(lèi)是與線程相關(guān)的一個(gè)工具類(lèi)唧取,顧名思義這個(gè)類(lèi)能夠到了設(shè)置的時(shí)間就運(yùn)行一些代碼铅鲤,這些代碼寫(xiě)在run方法里。使用這個(gè)類(lèi)的時(shí)候需要繼承TimerTask類(lèi)枫弟,使用Timer對(duì)象調(diào)用schedule方法實(shí)現(xiàn)定時(shí)邢享。
代碼示例: