Собеседование по Java — многопоточность (вопросы и ответы)

Собеседование по Java — многопоточность (вопросы и ответы)

Вопросы и ответы для собеседования Java по теме — многопоточность.

К списку вопросов по всем темам Вопросы

1. Дайте определение понятию “процесс”. 2. Дайте определение понятию “поток”. 3. Дайте определение понятию “синхронизация потоков”. 4. Как взаимодействуют программы, процессы и потоки? 5. В каких случаях целесообразно создавать несколько потоков? 6. Что может произойти если два потока будут выполнять один и тот же код в программе? 7. Что вы знаете о главном потоке программы? 8. Какие есть способы создания и запуска потоков? 9. Какой метод запускает поток на выполнение? 10. Какой метод описывает действие потока во время выполнения? 11. Когда поток завершает свое выполнение? 12. Как синхронизировать метод? 13. Как принудительно остановить поток? 14. Дайте определение понятию “поток-демон”. 15. Как создать поток-демон? 16. Как получить текущий поток? 17. Дайте определение понятию “монитор”. 18. Как приостановить выполнение потока? 19. В каких состояниях может пребывать поток? 20. Что является монитором при вызове нестатического и статического метода? 21. Что является монитором при выполнении участка кода метода? 22. Какие методы позволяют синхронизировать выполнение потоков? 23. Какой метод переводит поток в режим ожидания? 24. Какова функциональность методов notify и notifyAll? 25. Что позволяет сделать метод join? 26. Каковы условия вызова метода wait/notify? 27. Дайте определение понятию “взаимная блокировка”. 28. Чем отличаются методы interrupt, interrupted, isInterrupted? 29. В каком случае будет выброшено исключение InterruptedException, какие методы могут его выбросить? 30. Модификаторы volatile и метод yield(). 31. Пакет java.util.concurrent 32. Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок? 33. Что используется в качестве mutex, если метод объявлен static synchronized? Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод? 34. Предположим в методе run возник RuntimeException, который не был пойман. Что случится с потоком? Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch)? Есть ли способ восстановить работу потока после того как это произошло? 35. Какие стандартные инструменты Java вы бы использовали для реализации пула потоков? 36.Что такое ThreadGroup и зачем он нужен? 37.Что такое ThreadPool и зачем он нужен? 38.Что такое ThreadPoolExecutor и зачем он нужен? 39.Что такое «атомарные типы» в Java? 40.Зачем нужен класс ThreadLocal? 41.Что такое Executor? 42.Что такое ExecutorService? 43.Зачем нужен ScheduledExecutorService?

Ответы 1. Дайте определение понятию “процесс”.

Процесс — это совокупность кода и данных, разделяющих общее виртуальное адресное пространство. Процессы изолированы друг от друга, поэтому прямой доступ к памяти чужого процесса невозможен (взаимодействие между процессами осуществляется с помощью специальных средств). Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память.

Многопоточность в Java: http://habrahabr.ru/post/164487/ 2. Дайте определение понятию “поток”.

Один поток («нить» или «трэд») – это одна единица исполнения кода. Каждый поток последовательно выполняет инструкции процесса, которому он принадлежит, параллельно с другими потоками этого процесса.

Thinking in Java.Параллельное выполнение. http://wikijava.it-cache.net/index.php@title=Glava_17_Thinking_in_Java_4th_edition.html 3. Дайте определение понятию “синхронизация потоков”.

Синхронизация относится к многопоточности. Синхронизированный блок кода может быть выполнен только одним потоком одновременно.

Java поддерживает несколько потоков для выполнения. Это может привести к тому, что два или более потока получат доступ к одному и тому же полю или объекту. Синхронизация — это процесс, который позволяет выполнять все параллельные потоки в программе синхронно. Синхронизация позволяет избежать ошибок согласованности памяти, вызванных непоследовательным доступом к общей памяти. Когда метод объявлен как синхронизированный — нить держит монитор для объекта, метод которого исполняется. Если другой поток выполняет синхронизированный метод, ваш поток заблокируется до тех пор, пока другой поток не отпустит монитор. Синхронизация достигается в Java использованием зарезервированного слова synchronized. Вы можете использовать его в своих классах определяя синхронизированные методы или блоки. Вы не сможете использовать synchronized в переменных или атрибутах в определении класса.

Синхронизация потоков, блокировка объекта и блокировка класса info.javarush.ru: http://goo.gl/gW4ONp 4. Как взаимодействуют программы, процессы и потоки?

Чаще всего одна программа состоит из одного процесса, но бывают и исключения (например, браузер Chrome создает отдельный процесс для каждой вкладки, что дает ему некоторые преимущества, вроде независимости вкладок друг от друга). В каждом процессе может быть создано множество потоков. Процессы разделены между собой (>программы), потоки в одном процессе могут взаимодействовать друг с другом (методы wait, notify, join и т.д.).

5. В каких случаях целесообразно создавать несколько потоков?

Многопоточные приложения применяются в случаях, когда можно разделить программу на несколько относительно независимых частей. В этом случае чтобы один код не ждал другой их помещают в различные потоки. В качестве примера можно привести программу с графическим интерфейсом — пока выполняются какие-либо длительные вычисления в одном потоке, интерфейс может быть доступен пользователю и не зависать, если он выполняется в другом потоке.

6. Что может произойти если два потока будут выполнять один и тот же код в программе?

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

7. Что вы знаете о главном потоке программы?

Маленькие программы на Java обычно состоят из одной нити, называемой «главной нитью» (main thread). Но программы побольше часто запускают дополнительные нити, их еще называют «дочерними нитями». Главная нить выполняет метод main и завершается. Аналогом такого метода main, для дочерних нитей служит метод run интерфейса Runnable. Много потоков — много методов main (run()).

📎📎📎📎📎📎📎📎📎📎