面试题:wait()、notify()、notifyAll()、join()、sleep()和yield()几个方法的区别

几个方法的作用:

一个线程调用一个共享对象的wait()方法时,会被阻塞挂起,并释放该共享对象的监视器锁;

一个线程调用共享对象的notify()方法后,会随机唤醒一个在该共享变量上调用wait()系列方法后被挂起的线程;

调用共享对象的notifyAll()方法后,会唤醒所有在该共享变量上调用wait()系列方法后被挂起的线程;

join()方法的作用是等待线程执行终止,其方法内部会阻塞当前线程;

sleep()方法会让当前线程暂时让出CPU时间片,并休眠指定毫秒数的时间,但是该线程拥有的的监视器对象不会让出;

当一个线程调用yield()方法时,会让出CPU使用权,然后处于就绪状态;

如果调用wait()、notify()和notifyAll()方法的线程没有获取到监视器锁,则会抛出IllegalMonitorStateException,也就是说,这三个方法都要放到synchronized修饰的方法或者代码块里;

几个方法的区别:

方法的来源不同:

join()、sleep()和yield()方法是Thread类提供的;

wait()、notify()、notifyAll()方法是Object提供的;

sleep()和yield()的区别:

线程调用sleep()方法会被阻塞挂起指定的时间

而yield()方法只是让出自己CPU剩余的时间片,并不会挂起当前线程,而是处于就绪状态,也就是说可以参与下一次CPU调度;

sleep()和wait()的区别:

线程调用共享变量的wait()方法后会释放当前共享变量上的锁

sleep()不会释放锁,只是挂机一段时间,睡眠时间到了后就处于就绪状态。

你可能感兴趣的:(java,开发语言)