我有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/