general questions Flashcards

(28 cards)

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
30. Модификаторы volatile и метод yield()
volatile переменные меняются сразу в "медленной памяти" а не записываются в кэш. Вроде как операции с volatile переменными становятся атомарными.
26
32. Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок
Да иначе будет состояние гонки (race condition).
27
34.в методе run возник RuntimeException, не был пойман. Что случится с потоком Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch) Есть ли способ восстановить работу потока после того как это произошло
Если в дочернем потоке упадет Exception, то метод run() аварийно завершится и исключение будет передано в главный поток. Если исключение не обрабатывать, то нить (вызванная в методе run()) просто аварийно завершится. Восстановить работу нити после такого сценария нельзя, можно только создать нить заново.
28
35. Какие стандартные инструменты Java вы бы использовали для реализации пула потоков
new Thread(объект класса который implements Runnable или extends thread, где я переопределю метод run()).start() или ExecutorService exec = new Executors.newFixedThreadPool(3); exec.execute(тот же объект что ты бы вставил в Thread или implements Callable)