當前位置:編程學習大全網 - 編程語言 - java實現生產者和消費者問題的幾種方式

java實現生產者和消費者問題的幾種方式

生產者消費者問題是多線程的壹個經典問題,它描述是有壹塊緩沖區作為倉庫,生產者可以將產品放入倉庫,消費者則可以從倉庫中取走產品。

解決生產者/消費者問題的方法可分為兩類:

采用某種機制保護生產者和消費者之間的同步;

在生產者和消費者之間建立壹個管道。

第壹種方式有較高的效率,並且易於實現,代碼的可控制性較好,屬於常用的模式。第二種管道緩沖區不易控制,被傳輸數據對象不易於封裝等,實用性不強。

在Java中有四種方法支持同步,其中前三個是同步方法,壹個是管道方法。

wait() / notify()方法

await() / signal()方法

BlockingQueue阻塞隊列方法

PipedInputStream / PipedOutputStream

通過 wait() / notify()方法實現:

wait() / nofity()方法是基類Object的兩個方法:

wait()方法:當緩沖區已滿/空時,生產者/消費者線程停止自己的執行,放棄鎖,使自己處於等等狀態,讓其他線程執行。

notify()方法:當生產者/消費者向緩沖區放入/取出壹個產品時,向其他等待的線程發出可執行的通知,同時放棄鎖,使自己處於等待狀態。

通過await() / signal()方法實現:

await()和signal()的功能基本上和wait() / nofity()相同,完全可以取代它們,但是它們和新引入的鎖定機制Lock直接掛鉤,具有更大的靈活性。通過在Lock對象上調用newCondition()方法,將條件變量和壹個鎖對象進行綁定,進而控制並發程序訪問競爭資源的安全。

通過BlockingQueue方法實現:

它是壹個已經在內部實現了同步的隊列,實現方式采用的是我們第2種await() / signal()方法。它可以在生成對象時指定容量大小。它用於阻塞操作的是put()和take()方法:

put()方法:類似於我們上面的生產者線程,容量達到最大時,自動阻塞。

take()方法:類似於我們上面的消費者線程,容量為0時,自動阻塞。

  • 上一篇:哪有魔獸爭霸3冰封王座下載
  • 下一篇:哪些高薪職業最“燒腦”,工作兩年就“禿”了?
  • copyright 2024編程學習大全網