This week's book giveaway is in the OO, Patterns, UML and Refactoring forum. We're giving away four copies of Refactoring for Software Design Smells: Managing Technical Debt and have Girish Suryanarayana, Ganesh Samarthyam & Tushar Sharma on-line! See this thread for details.
I think whats happening here is before thread t start run method, main thread has already got the lock on object "t" as it is accessing synbchronized(t) block .So once main method finishes the execution of this block then thread t will start executing synchronized block on run method. Now when thread t executes wait() method,it remains in wait state forever as notify() method is already executed by the main thread. If you want to confirm this then you can have sleep() method after the line t.start() & try the output.