Поделиться через


ICondition.AwaitNanos(Int64) Метод

Определение

Вызывает ожидание текущего потока, пока он не будет сигнален или прерван, или указанное время ожидания истекает.

[Android.Runtime.Register("awaitNanos", "(J)J", "GetAwaitNanos_JHandler:Java.Util.Concurrent.Locks.IConditionInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")]
public long AwaitNanos (long nanosTimeout);
[<Android.Runtime.Register("awaitNanos", "(J)J", "GetAwaitNanos_JHandler:Java.Util.Concurrent.Locks.IConditionInvoker, Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")>]
abstract member AwaitNanos : int64 -> int64

Параметры

nanosTimeout
Int64

максимальное время ожидания в наносекундах

Возвращаемое значение

оценка nanosTimeout значения минус времени ожидания при возврате из этого метода. Положительное значение может использоваться в качестве аргумента для последующего вызова этого метода, чтобы завершить ожидание требуемого времени. Значение меньше или равно нулю указывает, что время не остается.

Атрибуты

Исключения

Значение , если текущий поток прерван (и поддерживается прерывание приостановки потока)

Комментарии

Вызывает ожидание текущего потока, пока он не будет сигнален или прерван, или указанное время ожидания истекает.

Блокировка, связанная с этим условием, атомарно освобождается, и текущий поток становится отключенным для целей планирования потоков и находится в состоянии спячки до тех пор, пока <em one</em>> из пяти вещей произойдет: <ul><li li Некоторые другие потоки вызывают #signal метод для этогоCondition, и текущий поток будет выбран в качестве потока для пробуждения; или <ли другой поток вызывает #signalAll метод для этогоCondition; или li>>><Некоторые другие потоки#прерывания прерывают текущий поток, и поддерживается прерывание приостановки потока; или <li>Указанное время ожидания истекает; или <li>A "<>возникает спровождительное пробуждение</em>" . </ul>

Во всех случаях, прежде чем этот метод сможет вернуть текущий поток, необходимо повторно получить блокировку, связанную с этим условием. Когда поток возвращает его, <>он гарантируется</em> для удержания этой блокировки.

Если текущий поток: <ul><li>имеет свой прерванный статус при входе в этот метод; или <ли>является Thread#прерывание при ожидании и прерывании приостановки потока поддерживается, /ul>, а InterruptedException затем возникает исключение и <состояние прерывания текущего потока очищается. В первом случае не указано, возникает ли проверка прерывания перед освобождением блокировки.

Метод возвращает оценку количества наносекунд, оставшихся для ожидания заданного nanosTimeout значения при возврате, или значение меньше или равно нулю, если время ожидания истекло. Это значение можно использовать для определения времени и времени повторного ожидания в случаях, когда ожидание возвращается, но ожидаемое условие по-прежнему не удерживается. Обычное использование этого метода принимает следующую форму:

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

Примечание к проектированию. Этот метод требует аргумента nanosecond, чтобы избежать ошибок усечения в отчете о оставшихся времени. Такая потеря точности затруднит программистов, чтобы гарантировать, что общее время ожидания не является систематически короче, чем указано при повторном ожидании.

<Рекомендации< по реализации b>/b>

Предполагается, что текущий поток удерживает блокировку, связанную с этим Condition при вызове этого метода. Это зависит от реализации, чтобы определить, является ли это делом и если нет, как реагировать. Как правило, исключение будет создано (например IllegalMonitorStateException), и реализация должна документировать этот факт.

Реализация может предпочесть реагирование на прерывание по сравнению с обычным методом, возвращаемым в ответ на сигнал, или более, что указывает на истечение указанного времени ожидания. В любом случае реализация должна убедиться, что сигнал перенаправляется в другой поток ожидания, если есть один.

Документация по Java для java.util.concurrent.locks.Condition.awaitNanos(long).

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

Применяется к