簡體   English   中英

生產者 - 消費者的Java多線程

[英]Java multithreading on producer-consumer

我正在關注Java多線程的視頻教程。 它介紹了如何使用Java來實現着名的“生產者 - 消費者”問題。

它使用wait()和notifyAll()來確保生產者線程和消費者線程之間的正確通信。

導師故意創建了幾個生產者線程,而只有一個消費者線程,但他留下了一個未回答的問題:“生產者和消費者線程數量相等,總是最好的做法,如果生產者線程多於消費者,就會出現問題” 。

但是,他沒有具體說明問題所在。 我個人認為這只是籃子已滿的情況。 專家可以幫忙嗎? 謝謝。

您可以擁有任意數量的生產者和任意數量的消費者。

如果生產者生產得太快,隊列將填滿,直到你遇到內存問題或生產者被迫保持閑置,直到隊列中有一些地方。

如果消費者消費太快,他們將在大多數時間保持閑置狀態。

擁有相同數量的生產者和消費者線程始終是最佳實踐

我個人不同意這一點。

有多少生產者以及消費者線程如何完全取決於具體情況。 沒有直截了當的規則。

我會告訴你我的情況,

我們有一個程序正在讀取CSV文件,從中創建XML並在JMS隊列上發布這些XML。 這個程序在開始時是單線程的,但是性能沒有達到標記。我們發現將消息發送到隊列花了很多時間。所以我們決定引入多線程。

我們在2個線程中划分邏輯 -

  1. 制片人

    讀取CSV並創建XML

  2. 消費者

    將XML發送到JMS隊列。

我們決定只有一個生產者,因為我們不想為文件打開多個句柄盡管它可能。 另一方面,我們保持創建的消費者線程數量可配置,並且工作正常,我們獲得了預期的性能提升。

總而言之,您需要確保生產者線程和消費者線程的速度幾乎匹配。否則,如果消費者線程比生產者慢,則記錄將堆積在內存(RAM)中,這可能導致極端情況下的OutOfMemory。

除了生產者效率之外,我沒有看到任何問題。 如果你有比消費者更多的生產者,並且他們都以相同的速度生產/消費,那么額外的生產者將有效地閑置。

請參閱make -j的最佳值 ,例如,建議您為n內核提供n+1個作業,以便它們始終處於滿負荷狀態。

那么,問題是資源最佳使用,即CPU和內存。 正如你正確猜測的那樣,籃子將是滿的(因此消耗更多的內存),生產者線程將閑置一段時間,直到消費者清空新任務的籃子,這將導致CPU的利用不足。

如果生產者和消費者的數量相等,則線程組(生產者和消費者)將忙於他們的任務,並且籃子也將具有穩定的存儲。

現在,太大或太少的生產者/消費者也將成為一個問題。 大量的踏板會占用CPU,從而導致其他問題(減速等)。 因此總有一個最佳數量取決於機器上可用的硬件資源。

@JB Nizet很好地總結了這種情況,因為你可能有太多的生產者太多的消費者。 決定因素只是生產者生產的比率與消費者消費的比率。 換句話說,如果生產資源需要花費更多的時間而不是消耗它,那么最好是擁有比消費者更多的生產者。 但是,如果消耗資源比生產資源需要更多的時間,那么最好是擁有比生產者更多的消費者。

導師可能假設消費過程比生產過程更有效,這可能在許多甚至大多數情況下都是正確的,但它不一定是一個很好的假設。 在設計生產者/消費者系統時,請盡量記住這一點。

我認為這不取決於消費者/生產者數量,而是取決於速度。 您可能有1個消費者可以在10毫秒內處理1個消息,2個生產者可以在100毫秒內生成1個消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM