线程通知和等待

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 异常。java

join() 等待线程执行终止

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

sleep(long time)

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

Thead.yield()

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

interrupt() isInterrput() interrupted()

  1. interrupt() 将线程的中断标志设置为 true,若是该线程由于调用 wait() join() 或者 sleep() 等方法被阻塞挂起,该线程会在调用这些方法的地方抛出 InterruptedException 异常方法。
  2. isInterrupted() 检测当前显示是否被中断,是返回 true, 不然返回 false。
  3. interrupted() 这个是个静态方法,若是线程被中断了,返回true, 不然返回false,若是发现线程被中,则会清除中断标志。
相关文章
相关标签/搜索