2010-04-14 59 views
1

我正在研究一個多線程應用程序,並需要一些僞代碼的幫助。爲了簡化實現,我將嘗試用簡單的術語/測試用例來解釋它。多線程應用程序 - 幫助一些僞代碼!

下面是這種情況 -

我有一個字符串數組列表(說100個字符串)

我有一個Reader類讀取字符串,並將其傳遞給作家類,打印字符串控制檯。現在它運行在單線程模型中。

我想使這個多線程,但具有以下特點 -

能夠設置MAX_READERS

能夠設置MAX_WRITERS

能夠設置BATCH_SIZE

所以基本上代碼應該實例化那些許多讀者和作家,並行地完成這項工作。

任何僞代碼真的會幫助我繼續前進!

+0

數組是在開始時給出的,還是它是一個傳入字符串流? – Yuval 2010-04-14 19:07:17

+0

好吧,如果你使用'java.util.concurrent'中的東西,它將會非常容易...但是既然你想要僞代碼,我想你希望它不使用它(用於學習目的?)? 我不清楚爲什麼你有'MAX_WRITERS'和'BATCH_SIZE',因爲如果你批量編寫,最明顯的實現將是總是有一個單一的作家。 (等待多個批次積累,然後在多個線程中做這些似乎很奇怪) – 2010-04-14 20:41:11

回答

3

這聽起來像經典的消費者生產者問題。看看Wikipedia's article吧。他們有很多僞代碼。

+0

你可能是對的!我想這更像是多線程的生產者/消費者模式! – jagamot 2010-04-14 18:58:36

0

除了使用已建議的producer-consumer pattern之外,我建議您使用CopyOnWriteArrayList,以便您可以對列表進行無鎖讀/寫/迭代。由於您只使用了幾百個字符串,因此您可能不會遇到CopyOnWriteArrayList的任何性能問題。

如果你關心性能,那麼我認爲它可能會更好,如果你使用BlockingQueueConcurrentHashMap。它們將允許您使用多線程應用程序最大化吞吐量。


推薦的選項:
一個BlockingQueue作品非常好,多個生產者和消費者,當然,這意味着數據處理(FIFO)的順序。如果您可以使用FIFO排序,那麼您可能會發現BlockingQueue是更快,更強大的選項。


我認爲,維基百科的文章對您使用足夠的僞代碼,但你也可以檢查出以下的一些做題:
https://stackoverflow.com/search?q=java+producer+consumer

Java的生產者 - 消費者設計:
Producer/Consumer threads using a Queue
design of a Producer/Consumer app

+0

@Lirik:我個人覺得這很混亂。首先,你通常不想在典型的生產者/消費者模型中使用CopyOnWriteArrayList(如果你生產很多,這不是一個好的選擇)。另外我認爲目前還不清楚爲什麼在這種情況下ConcurrentHashMap可能會有用。我的意思是,它對地圖有好處,但你需要一張地圖在哪裏? – 2010-04-14 22:34:47

+0

@Zwei,我提出CopyOnWriteArrayList的唯一原因是因爲OP正在使用一個數組,並且OP聲明數組中會有大約100個字符串。很顯然,BlockingQueue對於生產者/消費者設計來說是更好的選擇,所以也許我應該強調我的答案的一部分。 有很多情況下地圖是有用的,這裏有一個例子:你的製片人經常更新一個固定的數字字段,你只關心最新的更新(即高頻率的市場數據)......一個隊列可能會在這種情況下是不好的選擇。 – Kiril 2010-04-14 23:58:12

+0

@ZWei - 我在帖子中說過,我正在使用這個特殊的例子來讓事情更好理解。需要複製的數據不一定是字符串......一般來說它的數據庫......所以基本上讀者會從數據庫中讀取數據集,作家將把它們保存在不同的數據庫中.. – jagamot 2010-04-15 11:55:37