顺序操作以固定顺序执行,而不是先处理任何可用的结果。我怎样才能改变它?
假设:每个someSlowOperation(file);
呼叫都将花费可变的时间,因此,您希望在MyFileData
收到它后立即处理,但不要与另一个同时处理sequentialOperation
。
您可以通过设置生产者/消费者队列来实现这一点。
生产者是callables
您在示例中执行的,添加了一些位,您可以将结果添加到等待处理的工作队列中。
消费者是sequentialOperation()
调用 - 它在自己的线程中运行,并且只有一个。这个线程所做的只是获取队列的头部,并处理它,重复直到程序结束。
这样,您可以最大限度地利用机器上的所有资源。
带有一些示例代码的相关帖子:Producer/Consumer threads using a Queue
编辑:我想你可能想要一个快速的样本,因为它对以前从未做过的人来说非常不透明
public class Main {
private final ExecutorService producerExecutor = Executors.newFixedThreadPool(10);
private final ExecutorService consumerExecutor = Executors.newFixedThreadPool(1);
private final LinkedBlockingQueue<MyData> queue = new LinkedBlockingQueue();//or some other impl
abstract class Producer implements Runnable{
private final File file;
Producer(File file) {
this.file = file;
}
public void run() {
MyData result = someLongAssOperation(file);
queue.offer(result);
}
public abstract void someLongAssOperation(File file);
}
abstract class Consumer implements Runnable {
public void run() {
while (true) {
sequentialOperation(queue.take());
}
}
public abstract void sequentialOperation(MyData data);
}
private void start() {
consumerExecutor.submit(new Consumer(){
//implement sequentialOperation here
});
for (File f : files) {
producerExecutor.submit(new Producer(file) {
//implement the someLongAssOperation()
});
}
}
public static void main(String[] args) {
new Main().start();
}
}