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()
方法的线程会让出自己剩余的时间片,并处于就绪状态,并不会阻塞挂起,等待线程调用器的下一次调度。
interrupt() isInterrput() interrupted()
interrupt()
将线程的中断标志设置为 true,如果该线程因为调用wait()
join()
或者sleep()
等方法被阻塞挂起,该线程会在调用这些方法的地方抛出InterruptedException
异常方法。isInterrupted()
检测当前显示是否被中断,是返回 true, 否则返回 false。interrupted()
这个是个静态方法,如果线程被中断了,返回true, 否则返回false,如果发现线程被中,则会清除中断标志。