Multithreading is based on the concepts of concurrency and parallelism. Concurrency refers to the ability of a task to be split into independent subtasks that can be executed out of order without affecting the final result:

Let's look at the following example:
class Baker {
fun bake(): Cake {
for (i in 0..1_000_000_000) {
BigInteger.ONE.modPow(BigInteger.TEN, BigInteger.TEN)
}
return Cake()
}
}
The Baker class contains the bake() method, which invokes the modPow function that take a significant amount of time to imitate the process of baking and returns an instance of the Cake class:
class Cake
The Bakery class contains the order method, which takes the numberOfCakes argument and returns an instance of the List<Cake> type:
class Bakery {
fun order(numberOfCakes: Int): List<Cake> {
val...