The ability of a program to manage more than one thing at a time while giving an illusion of them happening at the same time is called concurrency, and such programs are called concurrent programs. Concurrency allows you to structure your program in a way that it performs faster if you have a problem that can be split into multiple sub-problems. When talking about concurrency, another term called parallelism is often thrown in the discussion, and it is important we know the differences as the usage of these terms often overlap. Parallelism is when each task runs simultaneously on separate CPU cores with non-overlapping time periods. The following diagram illustrates the difference between concurrency and parallelism:

To put it another way, concurrency is about structuring your program to manage more than one thing at a time, while parallelism is about putting your...