2012-02-22 36 views
4

我在運行使用Java執行管道的多個線程時遇到問題。Java中的Mutithreaded管道

說出了管道的 '輸入' 是:

5指令即:I1,I2,I3,I4,I5

如果I1已被提取這將是現在可以解碼,但是fetch操作不會等待decode任務完成。將提取的指令傳送到decode後,fetch操作現在將獲得下一條指令I2,依此類推。

這是一個流水線調度五個階段。

如何使用java多線程來模擬這樣的機器?

+1

這是[標籤:家庭作業]? – 2012-02-22 14:04:13

+1

這不是一項家庭作業,它是我研究課題的一部分,我必須能夠以表格形式生成管道調度。 – Celine 2012-02-24 22:35:55

回答

11

假設你想知道如何來實現這樣的事情:它被稱爲'管道模式'。如果這是而不是作業,則可以重新使用此模式的現有實施。一,請訪問:

http://code.google.com/p/pipelinepattern/

如果是這樣的功課,那麼你的老師都在盼望你來從頭開始寫你自己的。一個很好的出發點是這種兩個階段流水線(其中一個線程從文件中讀取線,而另一個線程打印的行):

http://rosettacode.org/wiki/Synchronous_concurrency#Java

在上述例子中的兩個階段通過BlockingQueue通信(即階段1寫入隊列,階段2讀取它)。如果階段1一直比階段2快,則隊列將變得相當大)。您可以改爲使用SynchronousQueue來強制執行階段操作(請參閱此答案的評論#1,爲什麼)。

如果你需要一個五級流水線,你需要有5個線程之間具有4個隊列擴展這個:

in -> [s1] -> q12 -> [s2] -> q23 -> [s3] -> q34 -> [s4] -> q45 -> [s5] -> out 

以上,每[s*]代表一個階段(線程),並且每個qAB代表隊列正在排隊到[sA]和出隊由[sB]

+1

很好的答案。請注意,儘管BlockingQueue可以工作,但我認爲SynchronousQueue可以更好地表示CPU中實際發生的情況。 – ARRG 2012-02-22 15:14:44

+0

同意。一個CPU管道以鎖步方式工作。我現在提到這一點。 – ArjunShankar 2012-02-22 15:23:00

+0

這是我的研究課題,我必須模擬一條管道,給出許多指令和五個管道階段。這是爲了教育目的。我還需要優化管道。 – Celine 2012-02-23 07:30:11