Async vs parallel processing
Imagine you are making a cake and a milkshake. You put the cake in the oven and realise it's going to take 2 hours to bake. Until the cake is in the oven, you smartly make the milkshake, and then come back to the oven and finish making the cake. That's async processing. All the work is being done on one thread but baking the cake is not blocking the thread.
Now imagine the same situation, except you are solely focused on making the cake, and a second person is solely focused on the milkshake. That's parallel processing. Each person is a thread focused on their own tasks. Baking the cake would block the thread it's running on, but since there are two threads, the milkshake is made at the same time as the cake.
In this scenario, it's trivial to see how you can asynchronously perform tasks in a multithreaded environment by combining the ideas in the first and second scenario.
To summarise, async processing involves performing tasks in a non-blocking way on one thread. Parallel processing involves performing blocking, or non-blocking tasks on multiple threads.