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