2013-04-09 2 views
1

У меня есть 6 функций:Pipelining в Java

  • операцией выборки
  • расшифровывает
  • выборки операндов
  • выполнить
  • обратной записи
  • updatepc

Каждый давая вход другой. Я хочу выполнить их в одно и то же время, то есть конвейерно.

Как это сделать?

+1

Это не то, что конвейерные средства. – delnan

ответ

2

Создайте класс для каждого компонента трубопровода, который реализует 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(); 
    } 
} 
+0

Большое спасибо. Я попробую это. Еще один вопрос. Очередь в вашем примере объявлена ​​в классе декодирования, и она устанавливается private.Will будет видна другим классам для опроса данных (я понимаю) ?. – user2262755

+0

Очередь будет невидимой для других объектов, потому что вы хотите, чтобы другие объекты могли добавлять данные в очередь, а не удалять данные из очереди. Предыдущий компонент, в этом случае компонент FetchOperation, должен иметь ссылку на компонент Decode и должен вызывать метод enqueue компонента Decode для передачи данных по конвейеру. –

1

Pipeline Pattern

трубопровода шаблон полезно в разделении проблемы на более мелкие повторно используемых компонентов кода. Это простой, но мощный структурный шаблон для организации сложной логики в более мелкие повторно используемые компоненты, , которые могут быть добавлены/удалены/изменены независимо.

+0

Я не уверен, как использовать это. Спасибо большое за ваш ответ. – user2262755

0

Чтобы улучшить @Zim-Zam O'Pootertoot's answer, вместо того, чтобы ваш компонент сон немного, когда нет ничего, чтобы обработать, вы могли бы это wait(), а затем вызвать notify() всякий раз, когда вы передаете это что-то обрабатывать.

Смежные вопросы