synchronized是原有锁对象的快捷写法,实际也是使用锁机制,只不过锁对象就是当前的对象.
wait和notify方法也是对当前对象而言的。
当第一个线程被启动,其运行了synchronized的方法,获得了当前对象的锁,然后打印出When......直到运行到wait(500),wait方法会先释放这个锁,这时候第二、三个线程其中一个会获得这个锁,然后又打印出When......如此类推就会打印三个When......但实际上同一时间只会运行一个。
wait(500)超时后线程会尝试获得锁,只有一个线程获得锁然后运行,其中notify方法会唤醒其余两个线程中的其中一个,但是它要获得锁才能运行下去,所以在等待。运行的线程继续运行打印出The......然后循环又打印出When.....,再wait()。wait释放锁,等待获得锁的线程其中一个会获得锁运行下去,如此类推。
直到最后i已经等于0,这时候运行线程打印出The.....,然后synchronized的方法运行完毕,释放锁。其余两个线程其中之一会获得该锁,又打印出The....,方法结束,释放锁,如此类推。
如果只要一个线程运行就不要wait释放锁,一直运行到底就行了。