我有6个功能:
每个人都给另一个人输入。我想在同一时间执行它们,即流水线。
怎么做?
答案 0 :(得分:2)
管道模式有助于将问题分解为更小的问题 可重用的代码组件。这是一个简单而强大的结构 模式将复杂的逻辑组织成更小的可重用组件, 可以单独添加/删除/修改。
答案 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()
要处理的事情。