general questions Flashcards

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

Поцесс это код и данные которые занимают своё виртуальное одресное пространство в OC.
Прямой доступ к другому процессу невозможен.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q
  1. Дайте определение понятию “поток”
A

Это виртуальная сущность, которая последовательно выполняет код.

Поток можно создать двумя способами: унаследовать класс Thread или реализовать интерфейс Runnable.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q
  1. Дайте определение понятию “синхронизация потоков”
A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q
  1. Как взаимодействуют программы, процессы и потоки
A

Программа - пассивная последовательность инструкций.
Процесс - выполнение этих инструкций.
В каждом процессе может быть множество потоков.
Потоки в одном процессе могут взаимодействовать друг с другом(методы wait, notify, join и т.д.)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q
  1. В каких случаях целесообразно создавать несколько потоков
A

Если возможно разделить программу на независимые части, то можно поместить их в разные потоки

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
  1. Что может произойти если два потока будут выполнять один и тот же код в программе
A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q
  1. Что вы знаете о главном потоке программы
A

Он выполняет метод main и завершается.
У дочерних нитей аналог main это метод run интерфейса Runnable

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q
  1. Какие есть способы создания и запуска потоков
A

Существует несколько способов создания и запуска потоков.

С помощью класса, реализующего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
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q
  1. Какой метод запускает поток на выполнение
A

Thread.start() запускает дочерний поток. Для интерфейса Callable запуск потока осуществляется с помощью метода submit().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q
  1. Какой метод описывает действие потока во время выполнения
A

Метод run() или метод call() для дочерних потоков. Метод main() для главного потока.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q
  1. Когда поток завершает свое выполнение
A

Поток закончит выполнение, когда завершится его метод run() или call(). Для главного потока это метод main().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q
  1. Как синхронизировать метод
A

Указать в сигнатуре модификатор synchronized или использовать конструкцию synchronized {} внутри метода.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q
  1. Как принудительно остановить поток
A

Принудительно остановить поток невозможно. Поток может остановиться только сам. Есть встроенный механизм оповещения потока который называется Interruption (прерывание, вмешательство).

В классе Thread есть bool флаг прерывания.
вот есть методы которые надо вызывать изнутри потока:
interrupt() - устанавливает флаг прерывания
bool isInterrupted() - возвращает состояние флага
bool Thread.interrupted() - возвращает состояние флага и сбрасывает его

И прописываешь катч интерраптед эксепшн в котором ретёрн возвращаешь чтобы завершить поток

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q
  1. Дайте определение понятию “поток-демон”
A

Потоки очень низкого приоритета которые выполняются в фоновом режиме.

Thread thread = new Thread(new DaemonClass());
thread.setDaemon(true);
System.out.println(thread.isDaemon()); //true

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q
  1. Как получить текущий поток
A

Вызвать в коде статический методThread.currentThread(), который вернет текущий поток.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q
  1. Дайте определение понятию “монитор”
A

Мьютекс или монитор - встроен в Object и есть у каждого объекта, показывает занят ли объект.
Нить засыпает в ожидании если хочет использовать объект с заблокированным монитором.

как я понял во всех объектах внутри блока синхронайзд поток изменяет значение в мониторе на время пока делает свои дела

17
Q
  1. Как приостановить выполнение потока
A

Thread.sleep() - приостанавливает выполнение потока, в котором он был вызван.(не путать с wait. wait это режим ожидания)

suspend, stop и resume — deprecated.

18
Q
  1. В каких состояниях может пребывать поток
A
  • созданный NEW
  • запущенный RUNNABLE
  • блокированный BLOCKED
  • остановленный TERMINATED
  • в режиме ожидания WAITING
  • в режиме ожидания по времени TIMED_WAITING

(NEW, RUNNABLE, BLOCKED, TERMINATED, WAITING, TIMED_WAITING).

19
Q
  1. Какие методы позволяют синхронизировать выполнение потоков
A

К этим методам относятся notify(), notifyAll(), wait();
Их можно использовать только внутри синхронайзд кода

20
Q
  1. Какой метод переводит поток в режим ожидания
A

Метод wait().
он может быть “Разбужен” другими потоками

21
Q
  1. Какова функциональность методов notify и notifyAll
A

Метод notify пробуждает один из потоков
notifyAll пробуждает все потоки.
Очерёдность зависит от приоритета

22
Q
  1. Что позволяет сделать метод join
A

Одна нить (поток) может вызвать метод join() у другой нити. В результате первый поток (который вызвал метод) приостанавливает свою работу и ждет окончания работы второго потока (у объекта которого был вызван метод join()).

23
Q
  1. Дайте определение понятию “взаимная блокировка” (deadlock)
A

Когда все потоки находятся в режиме ожидания

24
Q
  1. В каком случае будет выброшено исключение InterruptedException, какие методы могут его выбросить
A

Методы, требующие обработку этого исключения: wait, sleep, join. Исключение будет выброшено, если флаг interrupt у потока true.

25
Q
  1. Модификаторы volatile и метод yield()
A

volatile переменные меняются сразу в “медленной памяти” а не записываются в кэш.
Вроде как операции с volatile переменными становятся атомарными.

26
Q
  1. Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок
A

Да
иначе будет состояние гонки (race condition).

27
Q

34.в методе run возник RuntimeException, не был пойман. Что случится с потоком Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch) Есть ли способ восстановить работу потока после того как это произошло

A

Если в дочернем потоке упадет Exception, то метод run() аварийно завершится и исключение будет переданов главный поток.

Если исключение не обрабатывать, то нить (вызванная в методе run()) просто аварийно завершится. Восстановить работу нити после такого сценария нельзя, можно только создать нить заново.

28
Q
  1. Какие стандартные инструменты Java вы бы использовали для реализации пула потоков
A

new Thread(объект класса который implements Runnable или extends thread, где я переопределю метод run()).start()

или

ExecutorService exec = new Executors.newFixedThreadPool(3);
exec.execute(тот же объект что ты бы вставил в Thread или implements Callable)