java 并发编程实例_Java并发编程案例解读
經(jīng)過前面幾節(jié)的學(xué)習(xí),了解了多線程概念、Thread類的應(yīng)用、多線程數(shù)據(jù)同步存在的問題及解決方法。本節(jié)給出一個并發(fā)編程實例應(yīng)用案例,通過案例的學(xué)習(xí),可以靈活地把多線程知識應(yīng)用到實際編程中,解決在項目開發(fā)過程中遇到的并發(fā)編程問題。
在進入案例之前,先了解一下實現(xiàn)Java同步機制的幾個方法,Java.lang.object類提供了wati()、notify()、notifyAll()方法,它們與synchronized關(guān)鍵字結(jié)合使用,可以建立很多優(yōu)秀的同步模型。
當(dāng)synchronized修飾的方法或代碼塊中的wati()方法被調(diào)用時,當(dāng)前線程將被中斷運行,并且放棄該對象的鎖。
當(dāng)另外的線程執(zhí)行了某個對象的notify()方法后,會喚醒在此對象等待池中的某個線程,使之成為可運行的線程。notifyAll()方法會喚醒所有等待這個對象的線程,使之成為可運行的線程。
下面來看一個比較經(jīng)典的問題:生產(chǎn)者(Producer)和消費者(Consumer)問題。這個問題的解決就是通過靈活使用wati()、notify()、notifyAll()方法來實現(xiàn)的。
任務(wù)要求如下:
生產(chǎn)者將產(chǎn)品交給店鋪,消費者從店鋪取走產(chǎn)品,店鋪一次只能存儲固定數(shù)量的產(chǎn)品,如果生產(chǎn)者生產(chǎn)了過多產(chǎn)品,店鋪會讓生產(chǎn)者等一下,如果店中有空間存儲產(chǎn)品了,再通知生產(chǎn)者繼續(xù)生產(chǎn);如果店中沒有產(chǎn)品了,店鋪會告訴消費者等一下,如果店中有產(chǎn)品了,再通知消費者來取走產(chǎn)品。
要實現(xiàn)上述任務(wù)要求,我們需要定義一個生產(chǎn)者線程類和消費者線程類。再建立一個全局數(shù)組作為存儲產(chǎn)品的緩沖區(qū)。其控制過程是,生產(chǎn)者向緩沖區(qū)存入產(chǎn)品,消費者從緩沖區(qū)取走產(chǎn)品。當(dāng)緩沖區(qū)滿時,生產(chǎn)者必須阻塞,等待消費者取走產(chǎn)品后將其喚醒。當(dāng)緩沖區(qū)空時,消費者被阻塞,等待生產(chǎn)者生產(chǎn)了產(chǎn)品后將其喚醒。
(1)定義產(chǎn)品類,產(chǎn)品包含一個產(chǎn)品標(biāo)識的id屬性。另外要在生產(chǎn)或消費時打印產(chǎn)品的詳細內(nèi)容,因此重寫toString()方法,產(chǎn)品類的代碼如下所示:
(2)定義店鋪類,店鋪一次只能持有10份產(chǎn)品,如果生產(chǎn)者生產(chǎn)的產(chǎn)品多余10分,則會讓當(dāng)前正在此對象上操作的線程等待。一個線程訪問addProduct方法時,它已經(jīng)拿到這個鎖了,當(dāng)遇到產(chǎn)品大于10份時,它會阻塞。如果沒有大于10份,則繼續(xù)生產(chǎn)產(chǎn)品,并且調(diào)用notify方法,叫醒一個正在當(dāng)前這個對象上等待的線程。這里請注意,notify和wait一般是一一對應(yīng)的。代碼如下所示:
(3)定義生產(chǎn)者線程類,生產(chǎn)者負責(zé)生產(chǎn)產(chǎn)品,每生產(chǎn)完一個產(chǎn)品,調(diào)用Thread類的sleep方法休眠一段時間,模擬生產(chǎn)過程。代碼如下:
(4)定義消費者線程類,消費者負責(zé)消費產(chǎn)品,消費者每消費完一個產(chǎn)品,調(diào)用Thread類的sleep方法休眠一段時間,模擬消費過程。代碼如下:
(5)定義主線程類。代碼如下:
主線程類首先實例化Shop對象,然后分別實例化生產(chǎn)者線程和消費者線程。程序輸出結(jié)果如下圖所示:
■ 知識點撥
案例有兩個線程類,分別是Producer類(生產(chǎn)者)和Consumer類(消費者),Shop類(店鋪)負責(zé)產(chǎn)品的購進(存儲產(chǎn)品的數(shù)量有限)與銷售,因此Shop類需要協(xié)調(diào)Producer類和Consumer類,當(dāng)Producer類生產(chǎn)過多產(chǎn)品時,Shop類需要調(diào)用wait方法讓Producer類不要再繼續(xù)生產(chǎn),同時調(diào)用notify方法通知消費者來取走產(chǎn)品(如果有正在等待產(chǎn)品的消費者)。反之亦然,當(dāng)無產(chǎn)品可取時,Shop類需要調(diào)用wait方法讓Consumer類等待產(chǎn)品,同時調(diào)用notify方法通知生產(chǎn)者繼續(xù)生產(chǎn)產(chǎn)品。
總結(jié)
以上是生活随笔為你收集整理的java 并发编程实例_Java并发编程案例解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 手机号码归属地_【原创】Jav
- 下一篇: java 类的访问权限_什么是Java类