1.5 KiB
Problem 7.2: Implementation of ExecutorCompletionService
a) Implement the following simplified version of class java.util.concurrent.ExecutorCompletionService
:
public class SimpleExecutorCompletionService<ResultType> {
public SimpleExecutorCompletionService(ExecutorService ex) { … }
// Submit task to ex for execution:
public Future<ResultType> submit(Callable<ResultType> task) { … }
// Fetch result of some finished task if available (else null):
public Future<ResultType> poll() { … }
}
Use class SimpleExecutorCompletionServiceTester
oin the file server to test your class. If your
implementation is correct, the numbers printed with "… received result" should appear in mostly1
ascending order. Method Future.isDone()
could be helpful for your implementation.
b) Add the following method to your class:
// Fetch result of some finished task (blocks until some has finished):
public Future<ResultType> take() throws InterruptedExecution { … }
Note that you have to change the submit method from (a), too, so that when a task finishes, the
threads waiting in take for a task to finish are notified. Use class
SimpleExecutorCompletionServiceTester_with_take
on the server to test your class.
-
This order is not really guaranteed: While the "internal" length of each task would indeed produce this order, the total execution time of a task may be longer due to external delays by the thread pool (e.g. how long it takes to start a submitted task) and by other threads (e.g. preemption). ↩︎