Yield doesn't do much of anything, really, nowadays; it offers other threads at the same priority a chance to run. Since virtually all modern thread libraries do round-robin time-sliced execution anyway -- i.e., every thread of a given priority automatically gets a chance to run. yield() was much more important when Java was new and most implementations were using a thread library (Green threads) that did not do time slicing -- i.e., without a call to yield(), the running thread might never give up the CPU.
If you called Thread.currentThread().yield() in the main method than it will go in the waiting stage, and one of the three threads (maybe due to time slicing) will go to the running stage. If you called it in run() then the currently executing thread that implements Runnable will wait.
Thread 2 started before Thread 1 this time. The code you have says that's likely to happen. But, if you comment out Thread.currentThread().yield() in main, you'll never ever get that because the first thread starts and maybe it doesn't print at first (due to context switching) but directly after (while no other threads are runnable) main goes back into a running state and then gives controls back (yield()) to a runnable thread. The one runnable thread in the pool is the first one.