TaskExecutorimplementation that executes each task synchronously in the calling thread.
Mainly intended for testing scenarios.
Execution in the calling thread does have the advantage of participating
in its thread context, for example the thread context class loader or the
thread's current transaction association. That said, in many cases,
asynchronous execution will be preferable: choose an asynchronous
TaskExecutor instead for such scenarios.