1) Exactly. "start" only prepares the JVM for executing a new thread. The precise moment "run" begins is up to scheduler. You cannot asume that run is started before the execution of the sentence next to "start".
2)A thread before tampering with the lock of an object must own it. This why wait and notify must be placed within synchronized blocks or methods that make sure the thread has adquired the lock of the object on which wait or notify are called:
The thread executing synchronized(this) adquires the lock of the object pointed by this (b). Then notify is called on this (*). Thus no IllegalMonitorStateException is thrown.
3) Yes, it is. The code a new thread executes begins with the code within run, and the print statement is there.
In the output you can see the names of such threads: main, and Thread-1
(*) In an instance method a call like notify() is the same as this.notify()
You can find interesting this material about threads:
The Java Tutorial