Assuming an implementation of the performCount()
method is provided prior to runtime,
which of the following are possible results of executing the following application? (Choose all that apply.)
import java.util.*; import java.util.concurrent.*; import java.util.stream.*; public class Main { public static Integer performCount(int exhibitNumber) { // IMPLEMENTATION OMITTED } /* ww w . j a va2s . c o m*/ public static void printResults(Future<?> f) { try { System.out.println(f.get()); // o1 } catch (Exception e) { System.out.println("Exception!"); } } public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService service = Executors.newSingleThreadExecutor(); final List<Future<?>> results = new ArrayList<>(); IntStream.range(0, 10) .forEach(i -> results.add( service.submit(() -> performCount(i)))); // o2 results.stream().forEach(f -> printResults(f)); service.shutdown(); } }
A, C, D, E.
The code compiles and runs without issue, so G and H are incorrect.
The return type of performCount()
is Integer, so the submit()
is interpreted as being applied to a Callable<Integer> value.
In this manner, the Future<?> is really a Future<Integer> object.
One possible implementation of performCount()
is just to return the input parameter; therefore A is a correct answer.
B is incorrect, because the return type is Integer, not Boolean.
The performCount()
method could just return null, so C is a correct choice.
The performCount()
can also throw a runtime exception; therefore D is also a correct answer.
It is also possible for our performCount()
to hang indefinitely, such as in a deadlock.
This would cause Future.
get()
to hang in printResults()
, making E also a correct answer.
Finally, any exception thrown in performCount()
will appear as an exception in the get()
operation.
Since the get()
operations are caught in a try/catch block in printResults()
, none of them will be unhandled, and F is incorrect.