wait() 等待(阻塞)线程
wait()
方法调用前需要先获取到该对象监视器锁,否则会抛出IllegalMonitorStateException
异常;
synchronized(共享变量) {
// dosomething
}
synchronized void method(int a, int b) {
// dosomething
}
- 当(1)调用了该共享变量的
notify()
或者notifyAll()
方法,(2)其他线程调用了该线程的interrupt()
方法,该线程抛出InterruptException
异常,都会使线程返回。 wait()
会释放共享变量上的锁。
虚假唤醒
- 一个线程在没有被其他线程调用
notify()
notifyAll()
方法进行通知,或者被中断,或者等待超时,线程从挂在状态变为了可以运行状态(被唤醒),这就是所谓的虚假唤醒。
在条件循环中调用wait()
方法进行虚假唤醒的防范
synchronized (obj) {
whiel(条件) {
obj.wait();
}
}
- wait(long timeout) timeout时间内没有被其他线程调用该共享变量的
notify()
notifyAll()
方法唤醒,那么就会超时返回。
notify() notifyAll()
notify()
和 wait()
一样,如果没有获取共享变量的监视器锁,调用共享变量的 notify()
方法就会抛出 IllegalMonitorStateException
异常。
join() 等待线程执行终止
线程A 调用 线程B 的 join()
方法会阻塞线程B ,等待线程A执行完成返回。
sleep(long time)
当一个线程调用了 Thread
的 sleep
方法,调用线程会暂时让出指定时间执行权,也就是这个期间不参与CPU的调度,但是线程持有的监视器资源(比如锁)不让出。
Thead.yield()
调用 yield()
方法的线程会让出自己剩余的时间片,并处于就绪状态,并不会阻塞挂起,等待线程调用器的下一次调度。