Thread类中的start()和run()方法
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样,当你调用run()方法的时候,只是会在原来的线程中调用,没有启动新的线程,start()方法才会启动新线程。
为什么wait,notify和notifyAll这些方法不在Thread类中
主要的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得,如果线程需要等待某些锁,那么调用对象中的wait()方法就有意义了,如果wait方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait、notify、notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。
为什么wait和notify方法要在同步代码中使用?
1.只有调用线程拥有某个对象的独占锁时,才能够调用该对象的wait notify notifyAll方法。
2.如果你不这么做,会抛出IllegalMonitorStateException异常。
3.为了避免wait和notify直接产生竞争条件。
wait方法强制当前线程释放对象锁,这意味着调用某个对象的wait()方法之前,当前线程必须已经获得了锁,因此,线程必须在某个对象同步方法或同步代码块中才能使用该对象的wait()方法。
在调用对象的notify和notifyAll方法之前,调用线程必须已经得到了该对象的锁,因此线程必须在同步方法或同步代码块中才能使用该对象的notify()和notifyAll()方法。
调用wait()方法通常的原因是:调用线程希望某个特殊的状态(或变量)被设置之后再继续执行,调用notify()或notifyAll()方法的原因通常是,调用线程希望告诉其他正在等待中的线程“特殊状态已经被设置”这个状态作为线程之间通信的通道,它必须是一个可变的共享变量。