Java中的多线程管道



我在Java中运行多个线程执行管道时遇到问题。

假设管道的"输入"是:

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]退出。

最新更新