wait()
方法调用前须要先获取到该对象监视器锁,不然会抛出 IllegalMonitorStateException
异常;synchronized(共享变量) { // dosomething } synchronized void method(int a, int b) { // dosomething }
notify()
或者 notifyAll()
方法,(2)其余线程调用了该线程的 interrupt()
方法,该线程抛出 InterruptException
异常,都会使线程返回。wait()
会释放共享变量上的锁。notify()
notifyAll()
方法进行通知,或者被中断,或者等待超时,线程从挂在状态变为了能够运行状态(被唤醒),这就是所谓的虚假唤醒。wait()
方法进行虚假唤醒的防范synchronized (obj) { whiel(条件) { obj.wait(); } }
notify()
notifyAll()
方法唤醒,那么就会超时返回。notify()
和 wait()
同样,若是没有获取共享变量的监视器锁,调用共享变量的 notify()
方法就会抛出 IllegalMonitorStateException
异常。java
线程A 调用 线程B 的 join()
方法会阻塞线程B ,等待线程A执行完成返回。线程
当一个线程调用了 Thread
的 sleep
方法,调用线程会暂时让出指定时间执行权,也就是这个期间不参与CPU的调度,可是线程持有的监视器资源(好比锁)不让出。code
调用 yield()
方法的线程会让出本身剩余的时间片,并处于就绪状态,并不会阻塞挂起,等待线程调用器的下一次调度。对象
interrupt()
将线程的中断标志设置为 true,若是该线程由于调用 wait()
join()
或者 sleep()
等方法被阻塞挂起,该线程会在调用这些方法的地方抛出 InterruptedException
异常方法。isInterrupted()
检测当前显示是否被中断,是返回 true, 不然返回 false。interrupted()
这个是个静态方法,若是线程被中断了,返回true, 不然返回false,若是发现线程被中,则会清除中断标志。