我在運行使用Java執行管道的多個線程時遇到問題。Java中的Mutithreaded管道
說出了管道的 '輸入' 是:
5指令即:I1,I2,I3,I4,I5
如果I1已被提取這將是現在可以解碼,但是fetch
操作不會等待decode
任務完成。將提取的指令傳送到decode
後,fetch
操作現在將獲得下一條指令I2,依此類推。
這是一個流水線調度五個階段。
如何使用java多線程來模擬這樣的機器?
我在運行使用Java執行管道的多個線程時遇到問題。Java中的Mutithreaded管道
說出了管道的 '輸入' 是:
5指令即:I1,I2,I3,I4,I5
如果I1已被提取這將是現在可以解碼,但是fetch
操作不會等待decode
任務完成。將提取的指令傳送到decode
後,fetch
操作現在將獲得下一條指令I2,依此類推。
這是一個流水線調度五個階段。
如何使用java多線程來模擬這樣的機器?
假設你想知道如何來實現這樣的事情:它被稱爲'管道模式'。如果這是而不是作業,則可以重新使用此模式的現有實施。一,請訪問:
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]
很好的答案。請注意,儘管BlockingQueue可以工作,但我認爲SynchronousQueue可以更好地表示CPU中實際發生的情況。 – ARRG 2012-02-22 15:14:44
同意。一個CPU管道以鎖步方式工作。我現在提到這一點。 – ArjunShankar 2012-02-22 15:23:00
這是我的研究課題,我必須模擬一條管道,給出許多指令和五個管道階段。這是爲了教育目的。我還需要優化管道。 – Celine 2012-02-23 07:30:11
這是[標籤:家庭作業]? – 2012-02-22 14:04:13
這不是一項家庭作業,它是我研究課題的一部分,我必須能夠以表格形式生成管道調度。 – Celine 2012-02-24 22:35:55