general questions Flashcards
- Дайте определение понятию “процесс”
Поцесс это код и данные которые занимают своё виртуальное одресное пространство в OC.
Прямой доступ к другому процессу невозможен.
- Дайте определение понятию “поток”
Это виртуальная сущность, которая последовательно выполняет код.
Поток можно создать двумя способами: унаследовать класс Thread или реализовать интерфейс Runnable.
- Дайте определение понятию “синхронизация потоков”
Синхронизация относится к многопоточности. Синхронизированный блок кода может быть выполнен только одним потоком одновременно.
- Как взаимодействуют программы, процессы и потоки
Программа - пассивная последовательность инструкций.
Процесс - выполнение этих инструкций.
В каждом процессе может быть множество потоков.
Потоки в одном процессе могут взаимодействовать друг с другом(методы wait, notify, join и т.д.)
- В каких случаях целесообразно создавать несколько потоков
Если возможно разделить программу на независимые части, то можно поместить их в разные потоки
- Что может произойти если два потока будут выполнять один и тот же код в программе
Если используются не синхронизированные данные, то может произойти ситуация, когда код работает уже с устаревшими данными. Например, в первом потоке идет изменение каких-либо полей, а в это время второй поток читает эти поля.
- Что вы знаете о главном потоке программы
Он выполняет метод main и завершается.
У дочерних нитей аналог main это метод run интерфейса Runnable
- Какие есть способы создания и запуска потоков
Существует несколько способов создания и запуска потоков.
С помощью класса, реализующегоRunnable
- Создать объект классаThread.
- Создать объект класса, реализующего интерфейсRunnable
- Вызвать у созданного объекта Thread методstart()(после этого запустится методrun()у переданного объекта, реализующегоRunnable)
С помощью класса, расширяющегоThread
- Создать объект классаClassName extendsThread.
- Переопределитьrun()в этом классе (смотрите пример ниже, где передается имя потока ‘Second’)
С помощью класса, реализующегоjava.util.concurrent.Callable
- Создать объект класса, реализующего интерфейсCallable (или Runnable можно вообще анонимный класс можно вообще и его не писать а написать Лямбда функцию)
- Создать объектExecutorServiceс указанием пула потоков.
- Создать объект Future. Запуск происходит через методsubmit(); Сигнатура:<T> Future<T> submit(Callable<T> task)
или через метод execute
- Какой метод запускает поток на выполнение
Thread.start() запускает дочерний поток. Для интерфейса Callable запуск потока осуществляется с помощью метода submit().
- Какой метод описывает действие потока во время выполнения
Метод run() или метод call() для дочерних потоков. Метод main() для главного потока.
- Когда поток завершает свое выполнение
Поток закончит выполнение, когда завершится его метод run() или call(). Для главного потока это метод main().
- Как синхронизировать метод
Указать в сигнатуре модификатор synchronized или использовать конструкцию synchronized {} внутри метода.
- Как принудительно остановить поток
Принудительно остановить поток невозможно. Поток может остановиться только сам. Есть встроенный механизм оповещения потока который называется Interruption (прерывание, вмешательство).
В классе Thread есть bool флаг прерывания.
вот есть методы которые надо вызывать изнутри потока:
interrupt() - устанавливает флаг прерывания
bool isInterrupted() - возвращает состояние флага
bool Thread.interrupted() - возвращает состояние флага и сбрасывает его
И прописываешь катч интерраптед эксепшн в котором ретёрн возвращаешь чтобы завершить поток
- Дайте определение понятию “поток-демон”
Потоки очень низкого приоритета которые выполняются в фоновом режиме.
Thread thread = new Thread(new DaemonClass());
thread.setDaemon(true);
System.out.println(thread.isDaemon()); //true
- Как получить текущий поток
Вызвать в коде статический методThread.currentThread(), который вернет текущий поток.
- Дайте определение понятию “монитор”
Мьютекс или монитор - встроен в Object и есть у каждого объекта, показывает занят ли объект.
Нить засыпает в ожидании если хочет использовать объект с заблокированным монитором.
как я понял во всех объектах внутри блока синхронайзд поток изменяет значение в мониторе на время пока делает свои дела
- Как приостановить выполнение потока
Thread.sleep() - приостанавливает выполнение потока, в котором он был вызван.(не путать с wait. wait это режим ожидания)
suspend, stop и resume — deprecated.
- В каких состояниях может пребывать поток
- созданный NEW
- запущенный RUNNABLE
- блокированный BLOCKED
- остановленный TERMINATED
- в режиме ожидания WAITING
- в режиме ожидания по времени TIMED_WAITING
(NEW, RUNNABLE, BLOCKED, TERMINATED, WAITING, TIMED_WAITING).
- Какие методы позволяют синхронизировать выполнение потоков
К этим методам относятся notify(), notifyAll(), wait();
Их можно использовать только внутри синхронайзд кода
- Какой метод переводит поток в режим ожидания
Метод wait().
он может быть “Разбужен” другими потоками
- Какова функциональность методов notify и notifyAll
Метод notify пробуждает один из потоков
notifyAll пробуждает все потоки.
Очерёдность зависит от приоритета
- Что позволяет сделать метод join
Одна нить (поток) может вызвать метод join() у другой нити. В результате первый поток (который вызвал метод) приостанавливает свою работу и ждет окончания работы второго потока (у объекта которого был вызван метод join()).
- Дайте определение понятию “взаимная блокировка” (deadlock)
Когда все потоки находятся в режиме ожидания
- В каком случае будет выброшено исключение InterruptedException, какие методы могут его выбросить
Методы, требующие обработку этого исключения: wait, sleep, join. Исключение будет выброшено, если флаг interrupt у потока true.
- Модификаторы volatile и метод yield()
volatile переменные меняются сразу в “медленной памяти” а не записываются в кэш.
Вроде как операции с volatile переменными становятся атомарными.
- Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок
Да
иначе будет состояние гонки (race condition).
34.в методе run возник RuntimeException, не был пойман. Что случится с потоком Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch) Есть ли способ восстановить работу потока после того как это произошло
Если в дочернем потоке упадет Exception, то метод run() аварийно завершится и исключение будет переданов главный поток.
Если исключение не обрабатывать, то нить (вызванная в методе run()) просто аварийно завершится. Восстановить работу нити после такого сценария нельзя, можно только создать нить заново.
- Какие стандартные инструменты Java вы бы использовали для реализации пула потоков
new Thread(объект класса который implements Runnable или extends thread, где я переопределю метод run()).start()
или
ExecutorService exec = new Executors.newFixedThreadPool(3);
exec.execute(тот же объект что ты бы вставил в Thread или implements Callable)