I just ran into a code like this:
ExecutorService executorService = MoreExecutors.sameThreadExecutor();
for (int i = 0; i < 10; i++) {
executorService.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
try {
Do some work here...
return null;
} catch (final Exception e) {
throw e;
} finally {
//
}
}
});
}
Any difference between this and the code snippet below? If I understand it correctly, sameThreadExecutor uses the same thread that calls submit(), which means all these 10 "jobs" are run one by one on the main thread.
for (int i = 0; i < 10; i++) {
try {
Do some work here...
} catch (final Exception e) {
throw e;
} finally {
//
}
}
Thanks!
First, MoreExecutors#sameThreadExecutor is deprecated:
Deprecated. Use
directExecutor()if you only require anExecutorandnewDirectExecutorService()if you need aListeningExecutorService. This method will be removed in August 2016.
So question is: when do you need MoreExecutors#directExecutor or MoreExecutors#newDirectExecutorService (difference between those two is mentioned above - ListeningExecutorService is Guava's extension for ListenableFutures). Answers are:
Executor / ExecutorService (ex. your interface requires it) and don't want concurrency but rather run your multi-threaded code synchronouslyExecutorService like newDirectExecutorService by yourself, but don't want to reinvent the wheel (see its source code)ListenableFuture##addCallback(ListenableFuture, FutureCallback), newDirectExecutorService is used by default ("for use when the callback is fast and lightweight", also mentions it's "a dangerous choice in some cases" (see javadoc)).If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With