Maybe you should look at the following situation to understand this better. This is the example is concurrency which is not parallelism. Suppose that the task1 started at second 0, has been executing until second 2, then was waiting for the external input until second 6, and then finally run for 4 seconds and was completely finished at second 10. But there also is the task2. This task was started at the second 2 (when the task1 started waiting), has been executing until second 4, then was waiting for the external input until second 8, then was waiting until the task1 will be finished at the second 10, then ran for 4 seconds and was completely finished at second 14. So, as you can see, each task takes 10 seconds to fully complete their work (2 seconds of initial execution + 4 seconds of waiting for the external input + 4 seconds of the input processing and producing the result). If we run them sequentially, we would spend 20 seconds in total. But as we use concurrency, we save time by running the task2 when the task1 was sleeping (waiting). And in total, we spent just 14 seconds for the completion of 2 tasks instead of 20 seconds. The tasks were not executing simultaneously, but their execution time overlaps.