# ConditionVariable

Artifact: [androidx.media3:media3-common](https://developer.android.com/jetpack/androidx/releases/media3) [View Source](https://cs.android.com/search?q=file:androidx/media3/common/util/ConditionVariable.java+class:androidx.media3.common.util.ConditionVariable)

*** ** * ** ***

<br />

```
@UnstableApi
class ConditionVariable
```

<br />

*** ** * ** ***

An interruptible condition variable. This class provides a number of benefits over `https://developer.android.com/reference/android/os/ConditionVariable.html`:

- Consistent use of (`https://developer.android.com/reference/kotlin/androidx/media3/common/util/Clock#elapsedRealtime()` for timing `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#block(long)` timeout intervals. `https://developer.android.com/reference/android/os/ConditionVariable.html` used `https://developer.android.com/reference/java/lang/System.html#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 `https://developer.android.com/reference/kotlin/androidx/media3/common/util/Clock`.
- The ability to query the variable's current state, by calling `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#isOpen()`.
- `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#open()` and `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#close()` return whether they changed the variable's state.

## Summary

| ### Public constructors |
|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#ConditionVariable()()` Creates a closed instance using `https://developer.android.com/reference/kotlin/androidx/media3/common/util/Clock#DEFAULT()`. |
| `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#ConditionVariable(androidx.media3.common.util.Clock)(clock: https://developer.android.com/reference/kotlin/androidx/media3/common/util/Clock!)` Creates an instance, which starts closed. |

| ### Public functions |
|---|---|
| `synchronized https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#block()()` Blocks until the condition is opened. |
| `synchronized https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#block(long)(timeoutMs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html)` Blocks until the condition is opened or until `timeoutMs` have passed. |
| `synchronized https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#blockUninterruptible()()` Blocks until the condition is open. |
| `synchronized https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#blockUninterruptible(long)(timeoutMs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html)` Blocks until the condition is open or until `timeoutMs` have passed. |
| `synchronized https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#close()()` Closes the condition. |
| `synchronized https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#open()()` Opens the condition and releases all threads that are blocked. |

| ### Public properties |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#isOpen()` |

## Public constructors

### ConditionVariable

```
ConditionVariable()
```

Creates a closed instance using `https://developer.android.com/reference/kotlin/androidx/media3/common/util/Clock#DEFAULT()`.

### ConditionVariable

```
ConditionVariable(clock: Clock!)
```

Creates an instance, which starts closed.

| Parameters |
|---|---|
| `clock: https://developer.android.com/reference/kotlin/androidx/media3/common/util/Clock!` | The `https://developer.android.com/reference/kotlin/androidx/media3/common/util/Clock` whose `https://developer.android.com/reference/kotlin/androidx/media3/common/util/Clock#elapsedRealtime()` method is used to determine when `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#block(long)` should time out. |

## Public functions

### block

```
synchronized fun block(): Unit
```

Blocks until the condition is opened.

| Throws |
|---|---|
| `https://developer.android.com/reference/java/lang/InterruptedException.html` | If the thread is interrupted. |

### block

```
synchronized fun block(timeoutMs: Long): Boolean
```

Blocks until the condition is opened or until `timeoutMs` have passed.

| Parameters |
|---|---|
| `timeoutMs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html` | The maximum time to wait in milliseconds. If `timeoutMs <= 0` then the call will return immediately without blocking. |

| Returns |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | True if the condition was opened, false if the call returns because of the timeout. |

| Throws |
|---|---|
| `https://developer.android.com/reference/java/lang/InterruptedException.html` | If the thread is interrupted. |

### blockUninterruptible

```
synchronized fun blockUninterruptible(): Unit
```

Blocks until the condition is open.

Unlike `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#block()`, this method will continue to block if the calling thread is interrupted. If the calling thread was interrupted then its `https://developer.android.com/reference/java/lang/Thread.html#isInterrupted()` will be set when the method returns.

### blockUninterruptible

```
synchronized fun blockUninterruptible(timeoutMs: Long): Boolean
```

Blocks until the condition is open or until `timeoutMs` have passed.

Unlike `https://developer.android.com/reference/kotlin/androidx/media3/common/util/ConditionVariable#block()`, this method will continue to block if the calling thread is interrupted. If the calling thread was interrupted then its `https://developer.android.com/reference/java/lang/Thread.html#isInterrupted()` will be set when the method returns.

| Parameters |
|---|---|
| `timeoutMs: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html` | The maximum time to wait in milliseconds. If `timeoutMs <= 0` then the call will return immediately without blocking. |

| Returns |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | True if the condition was opened, false if the call returns because of the timeout. |

### close

```
synchronized fun close(): Boolean
```

Closes the condition.

| Returns |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | True if the condition variable was closed. False if it was already closed. |

### open

```
synchronized fun open(): Boolean
```

Opens the condition and releases all threads that are blocked.

| Returns |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | True if the condition variable was opened. False if it was already open. |

## Public properties

### isOpen

```
val isOpen: Boolean
```