parallele-programmierung/u07-2/SimpleExecutorCompletionSer...

51 lines
1.2 KiB
Java

import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
public class SimpleExecutorCompletionService<ResultType> {
private ExecutorService ex;
private ArrayList<Future<ResultType>> pendingFutures;
private ArrayList<Future<ResultType>> doneFutures;
public SimpleExecutorCompletionService(ExecutorService ex) {
this.ex = ex;
this.pendingFutures = new ArrayList<>();
this.doneFutures = new ArrayList<>();
}
synchronized public Future<ResultType> submit(Callable<ResultType> task) {
Future<ResultType> f = ex.submit(task);
this.pendingFutures.add(f);
return f;
}
synchronized public Future<ResultType> poll() {
this.updateFuturesLists();
if (!this.doneFutures.isEmpty()) {
return this.doneFutures.removeLast();
} else {
return null;
}
}
synchronized private void updateFuturesLists() {
for (int i = 0; i < this.pendingFutures.size(); i++) {
Future<ResultType> f = this.pendingFutures.get(i);
// for (Future<ResultType> f : this.pendingFutures) {
// causes concurrent access exception - why?
if (f.isDone()) {
this.pendingFutures.remove(f);
this.doneFutures.add(f);
}
}
}
}