Package com.google.android.exoplayer2.util

## Class ConditionVariable

- java.lang.Object
- - com.google.android.exoplayer2.util.ConditionVariable

-     public class ConditionVariable
      extends Object

  An interruptible condition variable. This class provides a number of benefits over `ConditionVariable`:
  - Consistent use of (`Clock.elapsedRealtime()` for timing `block(long)` timeout intervals. `ConditionVariable` used `System.currentTimeMillis()` prior to Android 10, which is not a correct clock to use for interval timing because it's not guaranteed to be monotonic.
  - Support for injecting a custom `Clock`.
  - The ability to query the variable's current state, by calling `isOpen()`.
  - `open()` and `close()` return whether they changed the variable's state.

- - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `ConditionVariable()` | Creates an instance using `Clock.DEFAULT`.
    `ConditionVariable​(Clock clock)` | Creates an instance, which starts closed.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `void` | `block()` | Blocks until the condition is opened.
    `boolean` | `block​(long timeoutMs)` | Blocks until the condition is opened or until `timeoutMs` have passed.
    `void` | `blockUninterruptible()` | Blocks until the condition is open.
    `boolean` | `close()` | Closes the condition.
    `boolean` | `isOpen()` | Returns whether the condition is opened.
    `boolean` | `open()` | Opens the condition and releases all threads that are blocked.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### ConditionVariable

          public ConditionVariable()

      Creates an instance using `Clock.DEFAULT`.

    - #### ConditionVariable

          public ConditionVariable​(Clock clock)

      Creates an instance, which starts closed.
      Parameters:
        `clock` - The `Clock` whose `Clock.elapsedRealtime()` method is used to determine when `block(long)` should time out.

  - ### Method Detail

    - #### open

          public boolean open()

      Opens the condition and releases all threads that are blocked.
      Returns:
        True if the condition variable was opened. False if it was already open.

    - #### close

          public boolean close()

      Closes the condition.
      Returns:
        True if the condition variable was closed. False if it was already closed.

    - #### block

          public void block()
                     throws InterruptedException

      Blocks until the condition is opened.
      Throws:
        `InterruptedException` - If the thread is interrupted.

    - #### block

          public boolean block​(long timeoutMs)
                        throws InterruptedException

      Blocks until the condition is opened or until `timeoutMs` have passed.
      Parameters:
        `timeoutMs` - The maximum time to wait in milliseconds. If `timeoutMs <= 0` then the call will return immediately without blocking.
      Returns:
        True if the condition was opened, false if the call returns because of the timeout.
      Throws:
        `InterruptedException` - If the thread is interrupted.

    - #### blockUninterruptible

          public void blockUninterruptible()

      Blocks until the condition is open. Unlike `block()`, this method will continue to block if the calling thread is interrupted. If the calling thread was interrupted then its `interrupted status` will be set when the method returns.

    - #### isOpen

          public boolean isOpen()

      Returns whether the condition is opened.