Starting a Runnable
Starting a runnable initiates the execution of the runnable’s task, as defined by its run() member. A start operation results in the synchronous or asynchronous execution of a runnable’s defined task, depending on the type of runnable. Asynchronous runnables create new threads to complete their tasks.
You must start a runnable object before it can begin execution of any activity or task that it defines. All runnable objects are started by calling the runnable’s start() function.
 
RWCompletionState
RWRunnable::start(void)
By starting a runnable, you begin a process that results in the eventual execution of that runnable’s virtual run() member. Each runnable class redefines the run() member to supply its own class-specific behavior.
The functor-based runnable classes include a version of the run() function that invokes the functor object supplied by some client. Similarly, the runnable server classes redefine run() to dequeue runnable objects and execute them by calling their start() members.
Although all runnables are started in the same way, the underlying start processes differ. The differences stem from the way a particular runnable class dispatches its run() function. The synchronous runnable classes have a different start-up process compared to that of the asynchronous, or threaded, runnable classes.
In the descriptions that follow, the numbers shown in the figures indicate the transitions produced by various events or operations. Numbers that appear inside square-brackets [x] refer to transitions in the execution state diagram. Numbers that appear in side curly braces {x} refer to transitions in the completion state diagram.