线程通知和等待

wait() 等待(阻塞)线程

  1. wait() 方法调用前需要先获取到该对象监视器锁,否则会抛出 IllegalMonitorStateException 异常;
synchronized(共享变量) {
      // dosomething
}
synchronized void method(int a, int b) {
      // dosomething
}
  1. 当(1)调用了该共享变量的 notify() 或者 notifyAll() 方法,(2)其他线程调用了该线程的 interrupt() 方法,该线程抛出 InterruptException 异常,都会使线程返回。
  2. wait() 会释放共享变量上的锁。

虚假唤醒

  1. 一个线程在没有被其他线程调用 notify() notifyAll() 方法进行通知,或者被中断,或者等待超时,线程从挂在状态变为了可以运行状态(被唤醒),这就是所谓的虚假唤醒。
    在条件循环中调用 wait() 方法进行虚假唤醒的防范
synchronized (obj) {
    whiel(条件) {
        obj.wait();
    }
}
  1. wait(long timeout) timeout时间内没有被其他线程调用该共享变量的 notify() notifyAll() 方法唤醒,那么就会超时返回。

notify() notifyAll()

notify()wait() 一样,如果没有获取共享变量的监视器锁,调用共享变量的 notify() 方法就会抛出 IllegalMonitorStateException 异常。

join() 等待线程执行终止

线程A 调用 线程B 的 join() 方法会阻塞线程B ,等待线程A执行完成返回。

sleep(long time)

当一个线程调用了 Threadsleep 方法,调用线程会暂时让出指定时间执行权,也就是这个期间不参与CPU的调度,但是线程持有的监视器资源(比如锁)不让出。

Thead.yield()

调用 yield() 方法的线程会让出自己剩余的时间片,并处于就绪状态,并不会阻塞挂起,等待线程调用器的下一次调度。

猜你喜欢

转载自www.cnblogs.com/Godfunc/p/11163067.html