Pre-emptive versus cooperative multitasking
The programs we wrote earlier using multiple threads were examples of concurrency. However, we didn't have to worry about how and when the operating system chose to run the thread—we just had to prepare the threads (or processes), provide the target function, and execute them. The scheduling is taken care of by the operating system.
Every few ticks of the CPU clock, the operating system pre-empts a running thread, and replaces it with another one in a particular core. This can happen due to different reasons, but the programmer doesn't have to worry about the details. He just creates the threads, sets them up with the data they need to process, uses the correct synchronization primitives, and starts them. The operating system does the rest including switching and scheduling.
This is how almost all modern operating systems work. It guarantees each thread a fair share of the execution time, all other things being equal. This is known as pre-emptive...