Как создать поток: 7 вариантов ответа.



Выбирайте любой или комбинируйте несколько, ведь это отличный шанс показать широкий кругозор и перевести разговор в интересную Вам сторону.



1️⃣ Синтаксический ответ — ожидаемый.

🅰️ реализовать интерфейс Runnable или Callable и передать новому объекту Thread:

Runnable action = () -> System.out.println("hey");

new Thread(action).start();

🅱️ расширить класс Thread, переопределить метод run, создать экземпляр этого класса:

class MyThread extends Thread {...}

new MyThread().star
t();



2️⃣ Углублённый ответ.

new Thread(...) приведёт к созданию в heap экземпляра класса Thread и сопутствующих объектов —program counter, хранилище thread-local переменных, нескольких стеков, объектов синхронизации и т.д. Вызов метода start() вызывает нативный метод start0(). Через JNI исполнится метод JVM JVM_StartThread, реализованный на C++, который вызывает метод ОС для создания потока. Для Unix это pthread_create.



3️⃣ Практический ответ.

Создание потока - ресурсоёмкая операция, поэтому лучше создать пул потоков, которые можно переиспользовать.

ExecutorService executor = Executors.newCachedThreadPool();

Runnable action = () -> System.out.println("hey");

executor.submit(action);



4️⃣ Неожиданный ответ.

Понятие потока в программировании очень размыто, особенно с учётом русского языка. Thread - структура для параллельного выполнения задач с помощью планировщика и потоков ОС.

Поток данных - тоже поток. В случае Stream API это скорее статичная коллекция, но можно рассказать интервьюеру основные методы его создания:

list.stream()

Stream.of(...)

Stream.range(...)

Arrays.stream(...)

Stream.generate(...)



5️⃣ Хайповый ответ.

Раз мы заговорили о потоке как потоке данных, то здесь можно свернуть в тему реактивного программирования. Самые популярные библиотеки для java это RxJava2, Project Reactor и Akka Streams. А также интерфейсы Flow API в java 9 и Reactive Streams.

Для примера рассмотрим создание потока в Reactor.

Поток из 0 или 1 элемента называется Mono:

Mono.just(1)

Mono.fromCallable(...)

Mono.fromFuture(...)

Mono.fromSupplier(...)

Поток из N элементов называется Flux:

Flux.just(1, 2, 3)

Flux.fromIterable(...)

Flux.fromStream(...)

Flux.range(...)



6️⃣ Big data oriented ответ.

В мире big data есть много фреймворков для обработки потоков данных. Apache Spark Streaming, Storm, Flink, Samza, Kafka Streams - если Вы работали с чем-то из этого списка, то обязательно поделитесь с интервьером этим опытом.



7️⃣ Менеджерский ответ.

Рассмотрим поток с нетехнической точки зрения. Поток - состояние, когда человек полностью включен в свою деятельность, совершенно сконцентрирован на ней и испытывает удовольствие от работы.

Задача руководителя - создать сотрудникам подходящие для этого условия. Можно использовать множество методов: регулярная обратная связь, увеличения прозрачности процессов и т.д.



Ответ на банальный вопрос "как создать поток" может различаться в зависимости от опыта и текущей должности. Вопросы на собеседованиях - лишь стартовая точка для обсуждений, не стесняйтесь повернуть разговор на обсуждение Ваших компетенций и сильных сторон.