在Java中进行流水线操作

时间:2013-04-09 16:42:11

标签: java pipelining

我有6个功能:

  • 获取操作
  • 解码
  • 获取操作数
  • 执行
  • 写回
  • updatepc

每个人都给另一个人输入。我想在同一时间执行它们,即流水线。

怎么做?

3 个答案:

答案 0 :(得分:2)

Pipeline Pattern

  

管道模式有助于将问题分解为更小的问题   可重用的代码组件。这是一个简单而强大的结构   模式将复杂的逻辑组织成更小的可重用组件,   可以单独添加/删除/修改。

答案 1 :(得分: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();
    }
}

答案 2 :(得分:0)

要改进@Zim-Zam O'Pootertoot's answer,而不是让您的组件在无法处理任何内容时暂停一下,您可以使用wait(),然后只要通过它就调用notify()要处理的事情。