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(), который вернет текущий поток.