Какие способы создания потоков существуют в Java
Javaасинхронностьмногопоточностьпотокиразработка на Java
Что проверяют
Знаете ли вы не только new Thread, но и то, чем пользуются на практике: пулы и виртуальные потоки.
Как отвечать
По возрастанию уровня:
- наследовать Thread и переопределить
run. Работает, но занимает единственное наследование и смешивает задачу с механизмом её выполнения; - реализовать Runnable (или
Callable, если нужен результат и проверяемое исключение) и передать в поток. Предпочтительнее, задача отделена от исполнителя; - ExecutorService: пул потоков, куда отправляются задачи. Это и есть рабочий вариант в приложениях: потоки переиспользуются, число ограничено, есть очередь, отмена, результат через
Future; - CompletableFuture: композиция асинхронных шагов без ручного управления потоками;
- ForkJoinPool и параллельные стримы для делимых вычислений;
- виртуальные потоки (Java 21): создаются миллионами, блокирующий вызов внутри не занимает поток операционной системы. Меняют экономику блокирующего ввода-вывода, но не отменяют проблем с общим состоянием.
Ключевая мысль: создавать потоки вручную в прикладном коде почти никогда не нужно. Поток дорог (около мегабайта стека), их число ограничено, и без пула нагрузка легко порождает тысячи потоков, из-за чего система тратит время на переключение вместо работы.
Полезно добавить про завершение: Thread.stop удалён как небезопасный, остановка кооперативная через флаг или interrupt.
Где спотыкаются
Называют только new Thread и наследование.
Не знают, чем Runnable отличается от Callable.
Создают поток на каждый запрос.
Не могут объяснить, зачем нужен пул, кроме «так принято».