[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-kakoe-iz-sleduyushchikh-utverzhdeniy-o-potokakh-neverno":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":20,"progress":21,"seo":22},285,"kakoe-iz-sleduyushchikh-utverzhdeniy-o-potokakh-neverno",8,"mnogopotochnost","Многопоточность","🔀","Какое из следующих утверждений о потоках неверно?","\u003C!-- grade: 4\u002F5 — корректный разбор; добавлено пояснение к каждому утверждению -->\n\nРассмотрим четыре утверждения:\n\n1. Если метод `start()` вызывается дважды для одного и того же объекта `Thread`, во время выполнения генерируется исключение.\n2. Порядок, в котором запускались потоки, может не совпадать с порядком их фактического выполнения.\n3. Если метод `run()` вызывается напрямую для объекта `Thread`, во время выполнения генерируется исключение.\n4. Если метод `sleep()` вызывается для потока, во время выполнения синхронизированного кода, блокировка не снимается.\n\n**Правильный ответ: утверждение 3 — неверно.**\n\n**Разбор каждого утверждения:**\n\n**Утверждение 1 — ВЕРНО.** Повторный вызов `start()` на уже запущенном (или уже завершённом) потоке выбрасывает `IllegalThreadStateException`. Поток может быть запущен ровно один раз.\n\n```java\nThread t = new Thread(() -> {});\nt.start();\nt.start(); \u002F\u002F IllegalThreadStateException\n```\n\n**Утверждение 2 — ВЕРНО.** Порядок фактического выполнения потоков определяется планировщиком ОС и зависит от приоритетов, загрузки процессора и других факторов. Порядок вызова `start()` не гарантирует порядок выполнения.\n\n**Утверждение 3 — НЕВЕРНО.** Прямой вызов `run()` не генерирует исключение. Однако `run()` выполнится **в текущем потоке** как обычный метод — новый поток создан не будет. Это частая ошибка начинающих: вместо `thread.start()` вызывают `thread.run()`.\n\n```java\nThread t = new Thread(() -> System.out.println(Thread.currentThread().getName()));\nt.run();   \u002F\u002F Выведет имя ТЕКУЩЕГО потока (main), а не нового\nt.start(); \u002F\u002F Выведет имя НОВОГО потока (Thread-0)\n```\n\n**Утверждение 4 — ВЕРНО.** Метод `Thread.sleep()` переводит поток в состояние `TIMED_WAITING`, но **не освобождает** удерживаемые мониторы. Это отличает его от `wait()`, который освобождает монитор объекта, на котором вызван.\n\n> **На собеседовании** этот вопрос проверяет понимание разницы между `start()` и `run()`, а также различие между `sleep()` и `wait()` в отношении блокировок.","","junior",[15,16,17,18,19],"потоки","start","run","Thread","concurrency",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":32,"featuredSnippetReady":33},"Утверждения о потоках Java — вопрос с подвохом — Gymterview","Вызов run() напрямую не генерирует исключение, но выполняет код в текущем потоке. Правильный запуск потока — метод start(). Разбор всех утверждений.","Какое утверждение о потоках в Java неверно?","Прямой вызов run() не бросает исключение — код выполняется в текущем потоке. Двойной вызов start() бросает IllegalThreadStateException.",[28,29,30,31],"Thread run vs start","утверждения о потоках Java","IllegalThreadStateException","запуск потока Java","Неверно утверждение, что вызов run() напрямую генерирует исключение. На самом деле run() выполнится в текущем потоке без ошибки, но новый поток не будет создан. Вызов start() дважды бросит IllegalThreadStateException. Порядок запуска потоков может не совпадать с порядком выполнения. При sleep() в synchronized блоке блокировка не снимается.",true]