Метод 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