Jetbrains in every article about kotlin speaks about asynchronous programming. But I can't understand why are they called asynchronous? As I understand kotlin coroutines - this is a state machine with pre-init thread pools. We have a worker thread pool and an io thread pool. For me this is just a multi threading programming. If we send a blocking code to the coroutine, a thread will be blocked. If we use async method(from default coroutines library) , it gives us an illusion asynchronous work, but this nothing but send 'job' to another thread.
Another question if we use async io with coroutines. But this is IO API async, not kotlin coroutines. Java has not good io async api in comparison with other languages (can be wrong). .NET as I know already rebuilt theirs async api (as IOCP) to use C# task and .NET has dedicated thread pool for waiting all io of apps, so one thread can handle many IO operations. But kotlin coroutines are not integrated to java nio and when we call nio from the coroutine (with or without Dispatcher.IO) we just ask a thread wait a data from nio. Java NIO has its own thread pool for epoll or iocp, so with kotlin coroutines we are creating overhead when asking Dispatcher.IO to give us a thread for waiting result from NIO, and after that NIO implementation creates own thread (pool) for waiting data from socket. Instead of one thread (pool) for waiting, we have two now.
So coroutines just allow us send job to another thread in an easy way. You can't do multiple things with one thread at the same time if your api doesn't implemented in async way with kotlin coroutines.