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,如果发现线程被中,则会清除中断标志。