Package org.apache.ignite

## Interface IgniteCondition

- All Superinterfaces:
    `Condition`

      public interface IgniteCondition
      extends Condition

  This interface provides a rich API for working with condition objects associated with distributed reentrant locks.

  # Functionality

  IgniteCondition provides functionality similar to `java.util.concurrent.locks.Condition`.

- - ### Method Summary

    All Methods Instance Methods Abstract Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `void` | `await()` | Causes the current thread to wait until it is signalled or interrupted.
    `boolean` | `await​(long time, TimeUnit unit)` | Causes the current thread to wait until it is signalled or interrupted, or the specified waiting time elapses.
    `long` | `awaitNanos​(long nanosTimeout)` | Causes the current thread to wait until it is signalled or interrupted, or the specified waiting time elapses.
    `void` | `awaitUninterruptibly()` | Causes the current thread to wait until it is signalled.
    `boolean` | `awaitUntil​(Date deadline)` | Causes the current thread to wait until it is signalled or interrupted, or the specified deadline elapses.
    `String` | `name()` | Name of ignite condition.
    `void` | `signal()` | Wakes up one waiting thread.
    `void` | `signalAll()` | Wakes up all waiting threads.

- - ### Method Detail

    - #### name

          String name()

      Name of ignite condition.
      Returns:
        Name of ignite condition.

    - #### await

          void await()
              throws IgniteInterruptedException,
                     IgniteException

      Causes the current thread to wait until it is signalled or interrupted.

      The lock associated with this `IgniteCondition` is atomically released and the current thread becomes disabled for thread scheduling purposes and lies dormant until one of six things happens:

      - Some other thread (on any node) invokes the `signal()` method for this `Condition` and the current thread happens to be chosen as the thread to be awakened; or
      - Some other thread (on any node) invokes the `signalAll()` method for this `Condition`; or
      - Some other thread interrupts the current thread, and interruption of thread suspension is supported; or
      - Some other node in grid fails, and lock is created in non-failoverSafe mode; or
      - Local node is stopped; or
      - A "spurious wakeup" occurs.

      If lock is not broken (because of failure of lock owner node) in non-failoverSafe mode and local node is alive, before this method can return the current thread must re-acquire the lock associated with this condition. In all other cases when the thread returns it is guaranteed to hold this lock.

      If the current thread:

      - has its interrupted status set on entry to this method; or
      - is interrupted while waiting and interruption of thread suspension is supported,
      then `IgniteInterruptedException` is thrown and the current thread's interrupted status is cleared. It is not specified, in the first case, whether or not the test for interruption occurs before the lock is released.

      Implementation Considerations

      The current thread is assumed to hold the lock associated with this `Condition` when this method is called. If not, an `IllegalMonitorStateException` will be thrown.

      Specified by:
        `await` in interface `Condition`
      Throws:
        `IgniteInterruptedException` - if the current thread is interrupted
        `IgniteException` - if the node stopped, or node owning the lock failed in non-failoversafe mode

    - #### awaitUninterruptibly

          void awaitUninterruptibly()
                             throws IgniteException

      Causes the current thread to wait until it is signalled.

      The lock associated with this condition is atomically released and the current thread becomes disabled for thread scheduling purposes and lies dormant until one of five things happens:

      - Some other thread invokes the `signal()` method for this `Condition` and the current thread happens to be chosen as the thread to be awakened; or
      - Some other thread invokes the `signalAll()` method for this `Condition`; or
      - Some other node in grid fails, and lock is created in non-failoverSafe mode; or
      - Local node is stopped; or
      - A "spurious wakeup" occurs.

      If lock is not broken (because of failure of lock owner node) in non-failoverSafe mode and local node is alive, before this method can return the current thread must re-acquire the lock associated with this condition. In all other cases, when the thread returns it is guaranteed to hold this lock.

      If the current thread's interrupted status is set when it enters this method, or it is interrupted while waiting, it will continue to wait until signalled. When it finally returns from this method its interrupted status will still be set.

      Implementation Considerations

      The current thread is assumed to hold the lock associated with this `Condition` when this method is called. If not, an `IllegalMonitorStateException` will be thrown.

      Specified by:
        `awaitUninterruptibly` in interface `Condition`
      Throws:
        `IgniteException` - if the node stopped, or node owning the lock failed in non-failoversafe mode

    - #### awaitNanos

          long awaitNanos​(long nanosTimeout)
                   throws IgniteInterruptedException,
                          IgniteException

      Causes the current thread to wait until it is signalled or interrupted, or the specified waiting time elapses.

      The lock associated with this condition is atomically released and the current thread becomes disabled for thread scheduling purposes and lies dormant until one of seven things happens:

      - Some other thread invokes the `signal()` method for this `Condition` and the current thread happens to be chosen as the thread to be awakened; or
      - Some other thread invokes the `signalAll()` method for this `Condition`; or
      - Some other thread interrupts the current thread, and interruption of thread suspension is supported; or
      - The specified waiting time elapses; or
      - Some other node in grid fails, and lock is created in non-failoverSafe mode; or
      - Local node is stopped; or
      - A "spurious wakeup" occurs.

      If lock is not broken (because of failure of lock owner node) in non-failoverSafe mode and local node is alive, before this method can return the current thread must re-acquire the lock associated with this condition. When the thread returns it is guaranteed to hold this lock.

      If the current thread:

      - has its interrupted status set on entry to this method; or
      - is interrupted while waiting and interruption of thread suspension is supported,
      then `IgniteInterruptedException` is thrown and the current thread's interrupted status is cleared. It is not specified, in the first case, whether or not the test for interruption occurs before the lock is released.

      The method returns an estimate of the number of nanoseconds remaining to wait given the supplied `nanosTimeout` value upon return, or a value less than or equal to zero if it timed out. This value can be used to determine whether and how long to re-wait in cases where the wait returns but an awaited condition still does not hold. Typical uses of this method take the following form:

           boolean aMethod(long timeout, TimeUnit unit) {
             long nanos = unit.toNanos(timeout);
             lock.lock();
             try {
               while (!conditionBeingWaitedFor()) {
                 if (nanos <= 0L)
                   return false;
                 nanos = theCondition.awaitNanos(nanos);
               }
               // ...
             } finally {
               lock.unlock();
             }
           }

      Design note: This method requires a nanosecond argument so as to avoid truncation errors in reporting remaining times. Such precision loss would make it difficult for programmers to ensure that total waiting times are not systematically shorter than specified when re-waits occur.

      Implementation Considerations

      The current thread is assumed to hold the lock associated with this `Condition` when this method is called. If not, an `IllegalMonitorStateException` will be thrown.

      Specified by:
        `awaitNanos` in interface `Condition`
      Parameters:
        `nanosTimeout` - the maximum time to wait, in nanoseconds
      Returns:
        an estimate of the `nanosTimeout` value minus the time spent waiting upon return from this method. A positive value may be used as the argument to a subsequent call to this method to finish waiting out the desired time. A value less than or equal to zero indicates that no time remains.
      Throws:
        `IgniteInterruptedException` - if the current thread is interrupted
        `IgniteException` - if the node stopped, or node owning the lock failed in non-failoversafe mode

    - #### await

          boolean await​(long time,
                        TimeUnit unit)
                 throws IgniteInterruptedException,
                        IgniteException

      Causes the current thread to wait until it is signalled or interrupted, or the specified waiting time elapses. This method is behaviorally equivalent to:

           awaitNanos(unit.toNanos(time)) > 0

      Specified by:
        `await` in interface `Condition`
      Parameters:
        `time` - the maximum time to wait
        `unit` - the time unit of the `time` argument
      Returns:
        `false` if the waiting time detectably elapsed before return from the method, else `true`
      Throws:
        `IgniteInterruptedException` - if the current thread is interrupted
        `IgniteException` - if the node stopped, or node owning the lock failed in non-failoversafe mode

    - #### awaitUntil

          boolean awaitUntil​(Date deadline)
                      throws IgniteInterruptedException,
                             IgniteException

      Causes the current thread to wait until it is signalled or interrupted, or the specified deadline elapses.

      The lock associated with this condition is atomically released and the current thread becomes disabled for thread scheduling purposes and lies dormant until one of seven things happens:

      - Some other thread invokes the `signal()` method for this `Condition` and the current thread happens to be chosen as the thread to be awakened; or
      - Some other thread invokes the `signalAll()` method for this `Condition`; or
      - Some other thread interrupts the current thread, and interruption of thread suspension is supported; or
      - Some other node in grid fails, and lock is created in non-failoverSafe mode; or
      - Local node is stopped; or
      - The specified deadline elapses; or
      - A "spurious wakeup" occurs.

      If lock is not broken (because of failure of lock owner node) in non-failoverSafe mode and local node is alive, before this method can return the current thread must re-acquire the lock associated with this condition. When the thread returns it is guaranteed to hold this lock.

      If the current thread:

      - has its interrupted status set on entry to this method; or
      - is interrupted while waiting and interruption of thread suspension is supported,
      then `IgniteInterruptedException` is thrown and the current thread's interrupted status is cleared. It is not specified, in the first case, whether or not the test for interruption occurs before the lock is released.

      The return value indicates whether the deadline has elapsed, which can be used as follows:

           boolean aMethod(Date deadline) {
             boolean stillWaiting = true;
             lock.lock();
             try {
               while (!conditionBeingWaitedFor()) {
                 if (!stillWaiting)
                   return false;
                 stillWaiting = theCondition.awaitUntil(deadline);
               }
               // ...
             } finally {
               lock.unlock();
             }
           }

      Implementation Considerations

      The current thread is assumed to hold the lock associated with this `Condition` when this method is called. If not, an `IllegalMonitorStateException` will be thrown.

      Specified by:
        `awaitUntil` in interface `Condition`
      Parameters:
        `deadline` - the absolute time to wait until
      Returns:
        `false` if the deadline has elapsed upon return, else `true`
      Throws:
        `IgniteInterruptedException` - if the current thread is interrupted (and interruption of thread suspension is supported)
        `IgniteException` - if the node stopped, or node owning the lock failed in non-failoversafe mode

    - #### signal

          void signal()
               throws IgniteException

      Wakes up one waiting thread.

      If any threads are waiting on this condition then one is selected for waking up. That thread must then re-acquire the lock before returning from `await`.

      Implementation Considerations

      The current thread is assumed to hold the lock associated with this `Condition` when this method is called. If not, an `IllegalMonitorStateException` will be thrown.

      Specified by:
        `signal` in interface `Condition`
      Throws:
        `IgniteException` - if node is stopped or node owning the lock failed in non-failoversafe mode

    - #### signalAll

          void signalAll()
                  throws IgniteException

      Wakes up all waiting threads.

      If any threads are waiting on this condition then they are all woken up. Each thread must re-acquire the lock before it can return from `await`.

      Implementation Considerations

      The current thread is assumed to hold the lock associated with this `Condition` when this method is called. If not, an `IllegalMonitorStateException` will be thrown.

      Specified by:
        `signalAll` in interface `Condition`
      Throws:
        `IgniteException` - if node is stopped or node owning the lock failed in non-failoversafe mode