You speak:
The result shows that we are ignoring asynchronous execution ....
No, it just means that you did not give asynchronously sent code enough time to start.
I know that queue2 must be completed before queue1 as it is doing synchronous execution ...
First, queue2 may not end before queue1. It just happens. Make queue2 do something much slower (for example, looping through several thousand iterations, not just five), and you will see that queue1 can actually start at the same time with respect to what's on queue2. First, it takes only a few milliseconds, and the material on your simple queue2 ends before the start of queue1 starts.
Secondly, it is not technically because it is synchronous execution. It's just that async takes a few milliseconds to get it working on some kind of workflow, while a synchronous call due to optimizations that I won't hide from you will start faster.
but why do we ignore asynchronous execution ...
We do not "ignore" him. First, you need only a few milliseconds.
and what is the actual difference between asynchronous, synchronizing and so-called main queues?
"Async" simply means that the current thread may carry and not wait for the sent code to run on some other thread. "Synchronization" means that the current thread must wait for the completion of the sent code.
The main thread is another topic and simply refers to the main thread created to control your user interface. In practice, the main thread is where most of your code is executed, basically everything works, except that you manually send it to some background queue (or the code sent there for you, for example, URLSession completion handlers).