2

我有 6 个功能:

  • 获取操作
  • 解码
  • 获取操作数
  • 执行
  • 回写
  • 更新电脑

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

怎么做?

4

3 回答 3

2

流水线模式

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

于 2013-04-09T16:44:20.143 回答
2

为每个实现Runnable的管道组件创建一个类。给每个组件一个ConcurrentLinkedQueue来保存要处理的数据;每个组件将在无限循环中轮询这个队列(在它的 run() 方法中),在它拉出数据时处理数据。每个前面的组件都会将其输出添加到下一个组件的队列中。现在将每个可运行对象分配给一个线程,启动线程,并开始向第一个组件的队列提供数据。

如果一个组件发现它的队列是空的,那么你可能想让它休眠半秒左右。

您可能还想为每个组件添加一个 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();
    }
}
于 2013-04-09T16:45:48.587 回答
1

为了改进@Zim-Zam O'Pootertoot 的回答,您可以拥有它,而不是让您的组件在没有什么要处理的情况下休眠一会儿,然后在您传递给它要处理的东西时wait()调用它。notify()

于 2017-02-09T22:19:28.250 回答