So I have been struggling with this thought, especially since I was trying to justify the use of reactive APIs with coroutines.
In search of my answer, I’ve read this article by Roman Elizarov, where he gives the example of turning a blocking IO operation into a non-blocking one with the use of withContext
to run the operation in Dispatchers.IO
.
Now, this is where I get a bit confused. The Dispatchers.IO
context is fundamentally an Executor (i.e. a thread pool), correct? So that means that if I have the following code:
suspend fun doesThisBlockAThreadOrWhat() = withContext(Dispatchers.IO) { jpaRepository.findAll() // A typical blocking operation using Spring Data JPA repositories }
it will still block a thread on the underlying Dispatchers.IO
right? So although we can suspend the execution on the calling side, there is still a thread being blocked that is not re-used to execute any other code while the JPA repository call hasn’t finished.
Is this correct? Am I missing something here?
submitted by /u/hastyyyy
[link] [comments]