Java 多线程中常用的方法
Object类的方法:wait(), notify(), notifyAll()
Thread类的方法:sleep(), yield(), join()
1. Object类的方法:wait(), notify(), notifyAll()
用于协调多线程对共享数据的存取,所以必须在Synchronized语句块内使用。
如果在其他地方调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException异常。
wait()
使当前线程暂停执行并释放对象锁,让其它线程可以进入Synchronized数据块。
当前线程被放入对象等待池中。
notify()
调用notify方法后,将从“对象等待池”中移走任意的线程并放到“锁标志等待池”中。
如果“对象等待池”中没有线程,则notify不起作用。
notifyAll()
从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中
2. Thread类的方法:sleep(), yield(), join()
sleep()
使当前线程暂停执行一段时间,让其它线程有机会继续执行。但是不释放对象锁。
在没有Synchronized保护下,高优先级线程调用sleep后,低优先级线程可以执行。
sleep可以使低优先级的线程得到执行的机会。
yield()
与sleep类似,只是不能由用户指定暂停多长时间,并且yield只能让同优先级的线程有执行的机会。
yield()方法称为“退让”。
yield做了如下操作:
先检测当前是否有相同优先级的线程处于可运行状态。
如果有,则把CPU的占有权交给此线程,否则继续运行原来的线程。
yield只是使当前线程重新回到可执行状态,所以执行yield的线程有可能在进入到可执行状态后马上又被执行。
当一个线程对象调用yield()方法时会马上交出执行权,回到可运行状态,等待OS的再次调用。
join()
当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转入阻塞状态,直到另一个线程运行完毕,它才进入可运行状态。
参考文档:
http://wenku.baidu.com/view/8f0a9a294b73f242336c5f7c.html
http://wenku.baidu.com/view/7a36f0db6f1aff00bed51e21.html
浙公网安备 33010602011771号