A thread is a certain set of instructions to be executed.
A function is a certain set of instructions to be executed.
With one (let's call it worker) worker per core, for a single core we have only 1 worker.
When we say concurrent multithreading, meaning multiple threads on single core, only one thread will be executed at a time. So the worker will execute some instructions from 1 thread then move onto another depending on how much time each thread has been assigned.
In asynchronous programming, we have one main thread running which executes some instructions from one function, then some from another.
In both cases, we have a single worker, executing part of a certain set of instructions, then moving on to another set of instructions. What is the difference?