У меня есть 6 функций:Pipelining в Java
- операцией выборки
- расшифровывает
- выборки операндов
- выполнить
- обратной записи
- updatepc
Каждый давая вход другой. Я хочу выполнить их в одно и то же время, то есть конвейерно.
Как это сделать?
У меня есть 6 функций:Pipelining в Java
Каждый давая вход другой. Я хочу выполнить их в одно и то же время, то есть конвейерно.
Как это сделать?
Создайте класс для каждого компонента трубопровода, который реализует Runnable. Дайте каждому компоненту ConcurrentLinkedQueue для хранения данных, подлежащих обработке; каждый компонент будет опросать эту очередь в бесконечном цикле (в методе run()), обрабатывая данные, когда он вытаскивает их. Каждый предшествующий компонент добавит свой вывод в очередь следующего компонента. Теперь назначьте каждый runnable потоку, запустите потоки и начните подавать данные в очередь первого компонента.
Если компонент обнаружил, что его очередь пуста, вы можете захотеть спать на полсекунды или около того.
Вы также можете добавить метод cancel() к каждому компоненту, который выйдет из бесконечного цикла в методе run().
public class Decode implements Runnable {
private boolean cancel = false;
private ConcurrentLinkedQueue<Data> queue = new ConcurrentLinkedQueue<>();
private FetchOperands nextComponent;
public void run() {
while(!cancel) {
Data data = queue.poll();
if(data != null) {
...
nextComponent.enqueue(data);
} else (Thread.sleep(500);
}
}
public void enqueue(Data data) {
queue.offer(data);
}
public void cancel() {
cancel = true;
}
public void setFetchOperands(FetchOperands nextComponent) {
this.nextComponent = nextComponent;
}
}
public class Main implements Runnable {
public void run() {
Decode decode = new Decode();
FetchOperands fetchOperands = new FetchOperands();
decode.setFetchOperands(fetchOperands);
Thread t1 = new Thread(decode);
Thread t2 = new Thread(fetchOperands);
t1.start();
t2.start();
t1.join();
t2.join();
}
}
Большое спасибо. Я попробую это. Еще один вопрос. Очередь в вашем примере объявлена в классе декодирования, и она устанавливается private.Will будет видна другим классам для опроса данных (я понимаю) ?. – user2262755
Очередь будет невидимой для других объектов, потому что вы хотите, чтобы другие объекты могли добавлять данные в очередь, а не удалять данные из очереди. Предыдущий компонент, в этом случае компонент FetchOperation, должен иметь ссылку на компонент Decode и должен вызывать метод enqueue компонента Decode для передачи данных по конвейеру. –
трубопровода шаблон полезно в разделении проблемы на более мелкие повторно используемых компонентов кода. Это простой, но мощный структурный шаблон для организации сложной логики в более мелкие повторно используемые компоненты, , которые могут быть добавлены/удалены/изменены независимо.
Я не уверен, как использовать это. Спасибо большое за ваш ответ. – user2262755
Чтобы улучшить @Zim-Zam O'Pootertoot's answer, вместо того, чтобы ваш компонент сон немного, когда нет ничего, чтобы обработать, вы могли бы это wait()
, а затем вызвать notify()
всякий раз, когда вы передаете это что-то обрабатывать.
Это не то, что конвейерные средства. – delnan