[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-chto-takoe-blokiruyushchiy-metod":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},277,"chto-takoe-blokiruyushchiy-metod",8,"mnogopotochnost","Многопоточность","🔀","Что такое блокирующий метод?","\u003C!-- grade: 3\u002F5 — слишком короткий; добавлены примеры, связь с Virtual Threads, таблица -->\n\n**Блокирующий метод** — это метод, который приостанавливает выполнение вызвавшего его потока до тех пор, пока не будет выполнено определённое условие (завершение операции ввода-вывода, поступление данных, истечение таймаута и т.п.). Управление не возвращается вызывающему коду, пока метод не завершится.\n\n**Примеры блокирующих методов:**\n\n| Метод | Что ожидает |\n|---|---|\n| `ServerSocket.accept()` | Подключение клиента |\n| `InputStream.read()` | Поступление данных |\n| `BlockingQueue.take()` | Появление элемента в очереди |\n| `Future.get()` | Завершение асинхронной задачи |\n| `Thread.join()` | Завершение другого потока |\n| `Lock.lock()` | Освобождение блокировки |\n| `CountDownLatch.await()` | Обнуление счётчика |\n| `Thread.sleep()` | Истечение заданного времени |\n\n**Неблокирующие альтернативы** (асинхронные методы) могут вернуть управление немедленно, не дожидаясь результата. Например:\n\n```java\n\u002F\u002F Блокирующий вызов — поток стоит, пока не придёт ответ\nHttpResponse\u003CString> response = httpClient.send(request, BodyHandlers.ofString());\n\n\u002F\u002F Неблокирующий вызов — возвращает CompletableFuture сразу\nCompletableFuture\u003CHttpResponse\u003CString>> future =\n    httpClient.sendAsync(request, BodyHandlers.ofString());\n```\n\n**Связь с Virtual Threads (Java 21+).** Виртуальные потоки делают блокирующие вызовы «дешёвыми»: когда виртуальный поток вызывает блокирующий метод, JVM автоматически отсоединяет его от потока-носителя, позволяя последнему выполнять другие виртуальные потоки. Это означает, что простой блокирующий код (`socket.read()`, `queue.take()`) при использовании виртуальных потоков по масштабируемости приближается к асинхронному.\n\n> **Аналогия:** блокирующий метод — это ожидание в очереди на почте. Вы стоите (поток заблокирован) и не можете делать ничего другого, пока не подойдёт ваша очередь. Неблокирующий метод — это когда вы берёте талончик с номером и идёте заниматься своими делами, пока вас не вызовут.\n\n> **На собеседовании** могут спросить: «Почему блокирующие вызовы проблематичны?» Ключевой ответ: каждый заблокированный Platform Thread занимает ~1 МБ стека и системные ресурсы, поэтому при тысячах одновременных блокировок ресурсы исчерпываются. Virtual Threads решают эту проблему, потому что блокировка виртуального потока не блокирует ОС-поток.","","junior",[15,16,17,18],"потоки","блокирующий-метод","асинхронность","concurrency",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":31,"featuredSnippetReady":32},"Что такое блокирующий метод в Java — определение и примеры — Gymterview","Блокирующий метод не возвращает контроль вызывающему коду до завершения задания. Пример — метод accept() у ServerSocket. Противоположность — асинхронные методы.","Блокирующий метод в Java — что это?","Блокирующий метод не отдаёт контроль до завершения задачи. Пример: ServerSocket.accept(). Существуют также асинхронные неблокирующие методы.",[27,28,29,30],"блокирующий метод Java","blocking method","accept ServerSocket","асинхронные методы Java","Блокирующий метод — метод, который блокируется до тех пор, пока задание не выполнится. Например, метод accept() у ServerSocket блокируется в ожидании подключения клиента. Контроль не вернётся к вызывающему методу до завершения задания. Также существуют асинхронные или неблокирующиеся методы, которые могут завершиться до выполнения задачи.",true]