You can easily imaging how it works if you divide program on suspension points. All the code in-between is callabacks and you schedule this callbacks to one-threaded executor. So each delay works not as a sleep, but rather, a schedule. Having one thread here doesn't play any role on how it is executed.