java - Java 中的流水线

标签 java pipelining

我有6个功能:

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

每个人都向另一个人提供输入。我想同时执行它们,即管道。

如何做到这一点?

最佳答案

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

如果组件发现其队列为空,那么您可能需要使其 hibernate 半秒左右。

您可能还想向每个组件添加一个 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();
    }
}

关于java - Java 中的流水线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15907674/

相关文章:

javascript - 如何获取ajax响应的属性

java - Android 应用程序在 Pause() 上崩溃——逻辑在一个项目中工作但在另一个项目中失败

python - 如何将 Python 进程的输出重定向到 Rust 进程?

caching - Redis 管道,处理缓存未命中

debian - 带有需要 tty 的 shell 脚本的 ansible 流水线模式

php - 在 PHP 中跨多个页面加载的持久 cURL 连接

java - Java 中的 Util 类

java - SAML 响应的 SAML2.0 签名验证失败

java - 如何在对象中创建 toString 方法?

java - 流水线或以其他方式在语言之间实时传输数据