РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1034 of 1163 menu

Метод tryAcquire

Метод tryAcquire класса Semaphore пытается захватить одно или несколько разрешений семафора. В отличие от метода acquire, он не блокирует текущий поток: если разрешения доступны, метод немедленно их захватывает и возвращает true, а если нет - сразу возвращает false. В первый параметр мы передаем количество захватываемых разрешений (по умолчанию одно), во второй - время ожидания, в третий - единицу измерения времени.

Синтаксис

semaphore.tryAcquire() semaphore.tryAcquire(permits) semaphore.tryAcquire(permits, timeout, unit)

Пример

Давайте создадим семафор с 2 разрешениями и попробуем захватить три разрешения подряд без ожидания:

import java.util.concurrent.Semaphore; public class Main { public static void main(String[] args) { Semaphore semaphore = new Semaphore(2); boolean first = semaphore.tryAcquire(); boolean second = semaphore.tryAcquire(); boolean third = semaphore.tryAcquire(); System.out.println(first); System.out.println(second); System.out.println(third); } }

Результат выполнения кода:

true true false

Пример

Давайте попробуем захватить разрешение с ожиданием в течение 1 секунды. Пока разрешений нет, поток будет ждать, а после освобождения - захватит его:

import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class Main { public static void main(String[] args) throws InterruptedException { Semaphore semaphore = new Semaphore(0); Thread releaser = new Thread(() -> { try { TimeUnit.MILLISECONDS.sleep(300); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } semaphore.release(); }); releaser.start(); boolean res = semaphore.tryAcquire(1, TimeUnit.SECONDS); System.out.println(res); } }

Результат выполнения кода:

true

Пример

Давайте попробуем захватить разрешение с ожиданием в течение 100 миллисекунд, когда разрешений нет и никто их не освобождает:

import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class Main { public static void main(String[] args) throws InterruptedException { Semaphore semaphore = new Semaphore(0); boolean res = semaphore.tryAcquire(1, 100, TimeUnit.MILLISECONDS); System.out.println(res); } }

Результат выполнения кода:

false

Смотрите также

  • метод acquire,
    который блокирующе захватывает разрешение
  • метод release,
    который освобождает разрешение семафора
  • класс Semaphore,
    который управляет доступом к ресурсам
  • метод tryLock,
    который неблокирующе захватывает блокировку
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить