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

Метод lockInterruptibly

Метод lockInterruptibly класса ReentrantLock захватывает блокировку, но, в отличие от метода lock, может быть прерван другим потоком. Если блокировка свободна, метод сразу её захватывает и возвращает управление. Если блокировка занята другим потоком, текущий поток переходит в состояние ожидания до тех пор, пока блокировка не освободится или пока поток не будет прерван. В случае прерывания метод выбрасывает исключение InterruptedException. Параметров метод не принимает.

Синтаксис

lock.lockInterruptibly()

Пример

Давайте захватим блокировку методом lockInterruptibly в основном потоке и выведем сообщение об успешном захвате:

import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) throws InterruptedException { ReentrantLock lock = new ReentrantLock(); lock.lockInterruptibly(); try { System.out.println("Lock acquired"); } finally { lock.unlock(); } } }

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

"Lock acquired"

Пример

Давайте создадим поток, который захватит блокировку и будет удерживать её, а второй поток попытается захватить её методом lockInterruptibly и будет прерван:

import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) throws InterruptedException { ReentrantLock lock = new ReentrantLock(); Thread holder = new Thread(() -> { lock.lock(); try { try { Thread.sleep(5000); } catch (InterruptedException e) { } } finally { lock.unlock(); } }); holder.start(); Thread.sleep(100); Thread waiter = new Thread(() -> { try { lock.lockInterruptibly(); try { System.out.println("Lock acquired"); } finally { lock.unlock(); } } catch (InterruptedException e) { System.out.println("Interrupted while waiting"); } }); waiter.start(); Thread.sleep(200); waiter.interrupt(); } }

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

"Interrupted while waiting"

Пример

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

import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) throws InterruptedException { ReentrantLock lock = new ReentrantLock(); Thread.currentThread().interrupt(); lock.lockInterruptibly(); try { System.out.println("Acquired, interrupted flag: " + Thread.currentThread().isInterrupted()); } finally { lock.unlock(); } } }

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

"Acquired, interrupted flag: true"

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

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