日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 并发编程实例_Java并发编程案例解读

發布時間:2024/9/30 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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并发编程案例解读的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。