zoukankan      html  css  js  c++  java
  • 线程通知和等待

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

    interrupt() isInterrput() interrupted()

    1. interrupt() 将线程的中断标志设置为 true,如果该线程因为调用 wait() join() 或者 sleep() 等方法被阻塞挂起,该线程会在调用这些方法的地方抛出 InterruptedException 异常方法。
    2. isInterrupted() 检测当前显示是否被中断,是返回 true, 否则返回 false。
    3. interrupted() 这个是个静态方法,如果线程被中断了,返回true, 否则返回false,如果发现线程被中,则会清除中断标志。
  • 相关阅读:
    SharePoint Framework 构建你的第一个web部件(二)
    win32
    win32
    win32
    win32
    C++ 将filesystem::path转换为const BYTE*
    win32
    win32
    win32
    win32
  • 原文地址:https://www.cnblogs.com/Godfunc/p/11163067.html
Copyright © 2011-2022 走看看