Executes the given Runnable action asynchronously in some thread.
The implementation may create a new thread to execute the action,
or it may execute the action in an existing thread.
The execution of a given action must not be delayed indefinitely
in order to complete execution of a different action passed to a
different invocation of this method. In other words, the
implementation must assume that there may be arbitrary dependencies
between actions passed to this method, so it needs to be careful
to avoid potential deadlock by delaying execution of one action
indefinitely until another completes.
Also, this method itself must not block, because it may be invoked
by code that is serially processing data to produce multiple such
arbitrarily-dependent actions that need to be executed.
runnable - the Runnable action to execute
name - string to include in the name of the thread used
to execute the action