Taken from @link com.google.common.util.concurrent.MoreExecutors} as it was hidden and
therefore incapable of instanceof checks.
Creates an executor service that runs each task in the thread that invokes execute/submit
, as in ThreadPoolExecutor.CallerRunsPolicy
This applies both to individually submitted
tasks and to collections of tasks submitted via invokeAll
or invokeAny
. In the
latter case, tasks will run serially on the calling thread. Tasks are run to completion before
a Future
is returned to the caller (unless the executor has been shutdown).
Although all tasks are immediately executed in the thread that submitted the task, this
ExecutorService
imposes a small locking overhead on each task submission in order to
implement shutdown and termination behavior.
The implementation deviates from the ExecutorService
specification with regards to the
shutdownNow
method. First, "best-effort" with regards to canceling running tasks is
implemented as "no-effort". No interrupts or other attempts are made to stop threads executing
tasks. Second, the returned list will always be empty, as any submitted task is considered to
have started execution. This applies also to tasks given to invokeAll
or invokeAny
which are pending serial execution, even the subset of the tasks that have not yet
started execution. It is unclear from the ExecutorService
specification if these
should be included, and it's much easier to implement the interpretation that they not be.
Finally, a call to shutdown
or shutdownNow
may result in concurrent calls to
invokeAll/invokeAny
throwing RejectedExecutionException, although a subset of the
tasks may already have been executed.