Java线程同步和线程调度的相关方法

1)wait():调用后线程进入无限等待状态,释放对象锁,进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout) timeout时间到自动唤醒。只能用在同步方法或者同步控制块中使用(synchronized);如果没有释放锁,那么其它线程就无法进入对象的同步方法或者同步控制块中,无法执行 notify() 或者 notifyAll() 来唤醒挂起的线程,造成死锁。

2)sleep():不会进入阻塞态,不释放对象锁,苏醒后自动进入就绪态

3)notify():唤醒一个处于等待状态的线程,如果多个线程在等待,并不能确切的唤醒一个线程,JVM确定唤醒那个线程,与其优先级有关,释放锁让就绪状态中的线程竞争获取锁

4)notityAll():唤醒所有处于等待状态的线程,但是并不是将对象的锁给所有的线程,而是让它们去竞争,谁先获取到锁,谁先进入就绪状态。

5)Thread.yield(),当前线程放弃获取的CPU时间片,但不释放锁资源,由运行状态变为就绪状态,Thread.yield()不会导致阻塞.

6) thread.join()/join(long millis):当前线程里调用其它线程的join方法,当前线程进入等待态,不会释放对象锁,直到目标线程结束,使得t.join()中的t优先执行

sleep()和wait()有什么区别

1)类不同:sleep()是Thread下的静态方法,wait()是Object类下的方法

2)是否释放锁:sleep()不释放锁,wait()释放锁

3)用处不同:wait()只能在同步方法里,sleep()可在任何地方使用。

4)用法不同:wait()调用后,必须等待唤醒或者等待超时才能执行,sleep()方法调用后,线程经过过一定时间会自动苏醒

5)苏醒后区别因为wait会释放锁,所以苏醒后没有获取到锁就进入堵塞状态,获取到锁就进入就绪状态,而sleep苏醒后之间进入就绪状态,但是如果cpu不空闲,则进入的是就绪状态的堵塞队列中