Многопоточный конвейер на Java - PullRequest
4 голосов
/ 22 февраля 2012

У меня проблема с запуском нескольких потоков, выполняющих конвейер в Java.

Скажите, что «вход» конвейера:

5 инструкций, а именно: I1, I2, I3, I4, I5

Если был извлечен I1, он будет готов к декодированию, но операция fetch не будет ждать завершения задачи decode. После передачи извлеченных инструкций в decode операция fetch теперь получит следующую инструкцию I2 и т. Д.

Это конвейерное планирование с пятью этапами.

Как мне смоделировать такую ​​машину, используя многопоточность Java?

1 Ответ

11 голосов
/ 22 февраля 2012

Предполагая, что вы хотите знать , как реализовать такую ​​вещь: она называется «конвейерным шаблоном».Если это , а не домашнее задание, вы можете повторно использовать существующую реализацию этого шаблона.Один доступен по адресу:

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

Если это домашняя работа, то ваш учитель может ожидать, что вы напишите ее самостоятельно.Хорошей отправной точкой является этот двухэтапный конвейер (где один поток читает строки из файла, а другой поток печатает строки):

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

В приведенном выше примере два этапасвязаться через BlockingQueue (т.е. этап 1 записывает в очередь, а этап 2 читает его).Если этап 1 последовательно быстрее, чем этап 2, очередь станет довольно большой).Вы можете принудительно задействовать этапы в lockstep, используя SynchronousQueue вместо этого [см. Комментарий № 1 к этому ответу, почему].

Если вам нужен пятиступенчатый конвейер, вам нужно расширить его, имея5 потоков, которые имеют 4 очереди между ними:

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

Выше, каждый [s*] представляет стадию (поток), а каждый qAB представляет Очередь, в которую ставится [sA] и удаляется из[sB]

...