Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции 2025. Java. Белая / Ответы на билеты. Java

.pdf
Скачиваний:
0
Добавлен:
02.01.2026
Размер:
4.52 Mб
Скачать

Резюме по компонентам интерфейса:

Компонент

Неявные

Доступность

Наличие

Начиная

 

модификаторы

 

реализации

с Java

 

(если не указаны)

 

 

 

 

 

 

 

 

Константы

 

public

Обязательна

Все

 

 

 

(при

версии

 

 

 

объявлении)

 

 

 

 

 

 

Абстрактные

 

public

Нет

Все

методы

 

 

 

версии

 

 

 

 

 

методы

 

public

Да

Java 8

 

 

 

 

 

методы

 

public

Да

Java 8

 

 

 

 

 

нестатические

 

private

Да

Java 9

 

 

 

 

методы

 

 

 

 

 

 

 

 

 

методы

 

private

Да

Java 9

 

 

 

 

 

 

 

 

 

Это делает интерфейсы очень гибким инструментом для определения контрактов и, с более новыми версиями Java, для предоставления некоторой базовой или вспомогательной функциональности.

56. Может ли интерфейс наследоваться от другого интерфейса?

Да, интерфейс в Java может наследоваться (расширять) от одного или нескольких других интерфейсов.

Синтаксис:

Используется ключевое слово . Если интерфейс расширяет несколько других интерфейсов, их имена перечисляются через запятую.

Что происходит при наследовании интерфейсов:

Наследование членов: Суб-интерфейс (расширяющий интерфейс) наследует все члены (константы и методы) своих супер-интерфейсов.

Абстрактные методы из супер-интерфейсов остаются абстрактными в суб-интерфейсе (если он их не "переопределяет" как метод, что возможно, но реже).

Константы из супер-интерфейсов доступны через имя суб-интерфейса.

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

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

Обязательства для реализующих классов: Любой класс, который реализует суб-интерфейс, автоматически обязан предоставить реализацию для всех абстрактных методов, унаследованных суб-интерфейсом от его суперинтерфейсов, а также для всех абстрактных методов, определенных непосредственно в самом суб-интерфейсе.

Пример:

Преимущества наследования интерфейсов:

1.Создание иерархий контрактов: Позволяет строить более сложные и специализированные контракты на основе общих.

2.Модульность: Разделение интерфейсов на более мелкие и их комбинирование через наследование.

3.Уменьшение дублирования: Общие объявления методов могут быть вынесены в супер-интерфейс.

4.Полиморфизм: Классы, реализующие суб-интерфейс, могут также рассматриваться как экземпляры любого из его супер-интерфейсов.

Наследование интерфейсов — это гибкий механизм для определения иерархий типов (контрактов) в Java, дополняющий одиночное наследование классов.

57. Использование Thread и Runnable. Пул потоков, назначение и принципы реализации.

Использование и для создания потоков:

ВJava есть два основных способа создать и запустить новый поток выполнения:

1.Наследование от класса :

Создается класс, который наследует

.

В этом классе переопределяется метод

, который содержит код,

выполняемый в новом потоке.

 

Для запуска потока создается экземпляр этого класса и вызывается его метод

.

Недостаток: Java не поддерживает множественное наследование классов. Если ваш класс уже наследует другой класс, вы не сможете использовать этот способ.

2. Реализация интерфейса :

Создается класс, который реализует интерфейс .

Этот интерфейс имеет один метод , который необходимо реализовать. Этот метод содержит код, выполняемый в новом потоке.

Для запуска потока создается экземпляр этого класса, затем создается объект , передавая ему в конструктор экземпляр , и у объекта

вызывается метод .

Преимущество: Этот способ более гибкий, так как класс, реализующий , может наследовать другой класс. Это предпочтительный способ создания потоков, так как он отделяет задачу (код в ) от механизма ее выполнения (объект ).

Пул потоков (Thread Pool):

Назначение:

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

к использованию рабочих потоков.

Основные цели использования пула потоков:

1.Уменьшение накладных расходов: Потоки переиспользуются, что исключает затраты на их создание и уничтожение для каждой новой задачи.

2.Управление ресурсами: Позволяет ограничить максимальное количество одновременно выполняющихся потоков, предотвращая исчерпание системных ресурсов (памяти, процессорного времени).

3.Улучшение отклика: Задачи могут начать выполняться быстрее, так как не нужно ждать создания нового потока.

4.Управление задачами: Пулы потоков часто предоставляют механизмы для управления задачами, такие как очереди задач, возможность отслеживать выполнение, получать результаты ().

Принципы реализации (с использованием Executor Framework):

Java предоставляет мощный фреймворк (в пакете ) для управления пулами потоков. Основные компоненты:

1. (интерфейс): Простой интерфейс с одним методом

, который передает задачу на выполнение.

2. (интерфейс): Расширяет , добавляя методы для управления жизненным циклом пула (например, , , который может возвращать ).

3. (утилитарный класс): Предоставляет статические фабричные методы для создания различных типов пулов потоков. Наиболее распространенные:

: Создает пул с фиксированным количеством потоков. Если все потоки заняты, новые задачи помещаются в очередь.

: Создает пул, который создает новые потоки по мере необходимости, но переиспользует ранее созданные свободные потоки. Если поток не используется в течение некоторого времени (обычно 60 секунд), он удаляется. Подходит для большого количества короткоживущих задач. Может создать очень много потоков, если задачи долго выполняются.

: Создает пул с одним рабочим потоком. Все задачи выполняются последовательно в этом потоке. Гарантирует, что задачи выполняются в порядке их поступления (FIFO).

: Создает пул, который может выполнять задачи с задержкой или периодически.

4. (класс): Более гибкий и настраиваемый класс для создания пулов потоков. Фабричные методы часто используют его "под капотом". Позволяет детально настроить параметры, такие как (минимальное количество потоков), (максимальное количество потоков), (время жизни простаивающих потоков сверх ), тип очереди задач () и обработчик отклоненных задач ().

Пример использования пула потоков:

Использование пулов потоков является стандартной практикой в многопоточных Javaприложениях для эффективного управления потоками и ресурсами.

58. Каким образом можно создать поток?

Этот вопрос дублирует часть предыдущего (57), но давайте сформулируем ответ конкретно на него.

ВJava поток выполнения можно создать двумя основными способами:

1.Наследование от класса :

Шаги:

1.Создать новый класс, который является подклассом .

2.В этом классе переопределить метод . Код, который должен выполняться в новом потоке, помещается в этот метод .

3.Создать экземпляр вашего нового класса (подкласса ).

4.Вызвать метод у этого экземпляра. Вызов инициирует запуск нового потока, который, в свою очередь, вызывает метод .

Пример:

Недостаток: Если ваш класс уже должен наследовать другой класс по бизнеслогике, этот способ не подойдет, так как Java не поддерживает множественное наследование классов.

2. Реализация интерфейса :

Шаги:

1.Создать новый класс, который реализует интерфейс .

2.В этом классе реализовать единственный метод интерфейса . Код для нового потока помещается сюда.

3.Создать экземпляр вашего класса, реализующего .

4.Создать экземпляр класса , передав ему в конструктор ссылку на ваш объект .

5.Вызвать метод у объекта . Это запустит новый поток, который вызовет метод вашего объекта .

Пример: