In the case of JS and NodeJS in particular, I know that there is one thread that runs the event loop, and async calls are delegated to the kernel (which might handle it with multi-threading behind the scenes, but that's abstracted for us).
However, what about other languages, like Java/Kotlin? Is there a similar mechanism to prevent using additional threads? Or is that the only way to go?
In case it is, it makes me wonder, is there a difference in such languages between standard multi-threading and async programming? or is it essentially the same?