Number of Threads: Threads can be a useful abstraction and implementation mechanism to partition independent program actions. However, when there is coordination (or interference) between these threads, the required synchronization mechanisms increase the time, increase the state space, and introduce potential liveness and safety problems.
Some of these cases can be reduced with multiplexing patterns; for example, separating asynchronous event emitters from a synchronous event processor by means of an event queue mechanism—i.e. combining sequenced operations inside of one dedicated thread (the event processor) instead of using explicit synchronization between several threads to enforce the sequencing.