Phaser
С
#для_продвинутых
Phaser очень похож на более известную CountDownLatch. Однако он предоставляет некоторые дополнительные функции. Он позволяет нам установить динамическое количество потоков, которые должны ждать перед продолжением выполнения. С
Phaser определенное количество потоков должно дождаться барьера, прежде чем перейти к следующей фазе выполнения. Благодаря этому мы можем координировать несколько фаз выполнения.#для_продвинутых
👍8
StringJoiner
В примере выше создается объект
#для_продвинутых
StringJoiner — это класс в Java, введенный в Java 8, который предоставляет удобный способ объединения строк с использованием разделителя. Этот класс обеспечивает более гибкий и выразительный способ объединения строк, чем использование обычных конкатенаций строк или метода StringBuilder.В примере выше создается объект
StringJoiner с разделителем ",". Затем добавляются три элемента ("Apple", "Banana", "Orange"). В результате вызова метода toString() получается строка, в которой элементы объединены с использованием заданного разделителя.#для_продвинутых
👍17
CountDownLatch
#для_продвинутых
CountDownLatch — это синхронизационный механизм, предоставляемый пакетом java.util.concurrent, который позволяет одному или нескольким потокам ждать, пока определенное количество операций завершится, прежде чем они смогут продолжить свою работу. Он полезен в ситуациях, когда нужно дождаться завершения нескольких параллельных задач, прежде чем продолжить выполнение кода.CountDownLatch работает по принципу счетчика, который уменьшается с каждым вызовом метода countDown(). Когда счетчик достигает нуля, все ожидающие потоки могут продолжить свою работу.#для_продвинутых
👍10❤1
Чем отличаются операторы & и &&, | и ||?
Anonymous Quiz
13%
Операторов & и | в Java нет
45%
& и | - унарные операторы, && и || - бинарные
42%
& и | всегда проверяют оба операнда на истинность, && и || - не всегда
🤔21👍12🔥1
BeanFactory
На картинке
Важно отметить, что
#для_продвинутых
BeanFactory — это интерфейс, определенный в фреймворке Spring, который предоставляет механизм для управления бинами (объектами), инверсии управления (IoC) и внедрения зависимостей (DI). Spring использует этот интерфейс для создания и управления бинами, которые представляют собой объекты, управляемые контейнером Spring.На картинке
XmlBeanFactory используется для создания контейнера бинов на основе конфигурационного файла beans.xml. В этом файле определяется бин с именем «helloWorld», и экземпляр этого бина извлекается из BeanFactory и использован.Важно отметить, что
XmlBeanFactory является устаревшим в новых версиях Spring. Вместо него рекомендуется использовать ApplicationContext, который предоставляет дополнительные функции и улучшенную производительность.#для_продвинутых
👍5
CompletableFuture
#для_продвинутых
CompletableFuture представляет собой мощный и гибкий механизм для асинхронного программирования и выполнения параллельных задач. Этот класс был введен в Java 8 и предоставляет более высокоуровневый интерфейс для работы с асинхронными операциями, чем традиционные Future и ExecutorService.#для_продвинутых
👍6
Low coupling
Low coupling (низкая связанность) в программировании означает уровень зависимости между различными компонентами или модулями программы. Чем ниже связанность, тем лучше, поскольку это облегчает изменения в коде, повышает его читаемость и обеспечивает легкость тестирования и поддержки.
Проектирование с низкой связанностью важно для создания гибкого, поддерживаемого и расширяемого кода. Это улучшает возможность внесения изменений без воздействия на другие части системы.
#для_продвинутых
Low coupling (низкая связанность) в программировании означает уровень зависимости между различными компонентами или модулями программы. Чем ниже связанность, тем лучше, поскольку это облегчает изменения в коде, повышает его читаемость и обеспечивает легкость тестирования и поддержки.
Проектирование с низкой связанностью важно для создания гибкого, поддерживаемого и расширяемого кода. Это улучшает возможность внесения изменений без воздействия на другие части системы.
#для_продвинутых
👍8
PriorityBlockingQueue
Однако важным отличием от стандартной очереди с приоритетом (
#для_продвинутых
PriorityBlockingQueue представляет собой реализацию интерфейса BlockingQueue, которая расширяет функциональность обычной очереди (Queue) для поддержки приоритетов элементов. Элементы в этой очереди сортируются с использованием их естественного порядка или с помощью компаратора, предоставленного во время создания очереди. Однако важным отличием от стандартной очереди с приоритетом (
PriorityQueue) является то, что PriorityBlockingQueue является блокирующей. Это означает, что если очередь пуста, поток, пытающийся извлечь элемент, будет блокирован до тех пор, пока другой поток не вставит элемент.#для_продвинутых
👍7
Метод newSingleThreadExecutor()
Метод
В примере выше создается
#для_продвинутых
Метод
newSingleThreadExecutor() используется для создания ExecutorService с единственным рабочим потоком. ExecutorService предоставляет удобный способ управления выполнением задач в асинхронном режиме.В примере выше создается
ExecutorService с одним рабочим потоком, и две задачи (task1 и task2) передаются на выполнение с использованием метода submit(). Закрытие ExecutorService выполняется с помощью метода shutdown(), который гарантирует, что больше никакие задачи не будут приняты, и потоки будут завершены после завершения всех текущих задач.#для_продвинутых
👍8
Какой метод должен быть переопределен классом, реализующим интерфейс Runnable для выполнения задачи в отдельном потоке?
Anonymous Quiz
4%
int run()
74%
void run()
3%
boolean run()
11%
void run(int priority)
8%
Узнать ответ
👍22
#Вопросы_с_собеседования
Рассмотрим задачу по созданию простого сервиса для управления задачами (To-Do list). Ваша задача — написать простую программу, которая позволяет добавлять задачи, удалять задачи и выводить список текущих задач.
Мы импортируем две библиотеки.
Затем создаем объект Scanner для считывания ввода с клавиатуры и бесконечный цикл для взаимодействия с пользователем.
Выводим меню с четырьмя действиями для пользователя, читаем выбор пользователя с клавиатуры и в зависимости от выбора пользователя, программа вызывает соответствующий метод. Этот метод запрашивает у пользователя новую задачу, добавляет её в список и выводит сообщение.
Таким образом, программа предоставляет простой интерфейс для взаимодействия с To-Do list, позволяя пользователю добавлять, удалять и просматривать задачи.
Рассмотрим задачу по созданию простого сервиса для управления задачами (To-Do list). Ваша задача — написать простую программу, которая позволяет добавлять задачи, удалять задачи и выводить список текущих задач.
Мы импортируем две библиотеки.
ArrayList используется для хранения списка задач, а Scanner — для ввода данных с клавиатуры. Затем определяем класс ToDoList и объявляем переменную tasks типа ArrayList, которая будет хранить наши задачи. Затем создаем объект Scanner для считывания ввода с клавиатуры и бесконечный цикл для взаимодействия с пользователем.
Выводим меню с четырьмя действиями для пользователя, читаем выбор пользователя с клавиатуры и в зависимости от выбора пользователя, программа вызывает соответствующий метод. Этот метод запрашивает у пользователя новую задачу, добавляет её в список и выводит сообщение.
Таким образом, программа предоставляет простой интерфейс для взаимодействия с To-Do list, позволяя пользователю добавлять, удалять и просматривать задачи.
👍18
PushbackInputStream
Когда вы считываете байты из
#для_продвинутых
PushbackInputStream — это класс, который обеспечивает возможность «откатывать» (push back) один или несколько байтов в поток ввода. Этот класс является подклассом FilterInputStream и добавляет функциональность для отката байтов.Когда вы считываете байты из
PushbackInputStream, вы можете использовать метод unread, чтобы вернуть один или несколько байтов обратно в поток. Это может быть полезно, например, если вы прочитали несколько байтов и поняли, что они не являются частью ожидаемых данных, и вы хотите вернуть их обратно для последующего считывания.#для_продвинутых
👍11❤1
ServletContext
Некоторые из основных методов, предоставляемых интерфейсом
#для_продвинутых
ServletContext — это интерфейс, который предоставляет методы для взаимодействия с контекстом сервлета. Контекст сервлета — это область, в которой работает сервлет, и предоставляет средства для обмена данными между сервлетами, а также для доступа к различным ресурсам, таким как файлы, базы данных и другие.Некоторые из основных методов, предоставляемых интерфейсом
ServletContext, включают:getInitParameter(String name): Возвращает значение инициализационного параметра сервлета, указанного по имени.getInitParameterNames(): Возвращает имена всех инициализационных параметров сервлета.getAttribute(String name): Возвращает значение атрибута, сохраненного в контексте сервлета по имени.setAttribute(String name, Object object): Устанавливает значение атрибута в контексте сервлета.getRequestDispatcher(String path): Возвращает объект RequestDispatcher, который используется для включения другого ресурса (например, другого сервлета или JSP-страницы) в текущий запрос.getRealPath(String path): Преобразует виртуальный путь в абсолютный путь на сервере.#для_продвинутых
👍7❤2
InterruptedException
Думаю, вы заметили, что мы везде обрабатываем эту ошибку. Пока поток ожидает, кто-то может прервать его работу.
Ещё можно приостановить работу во время выполнения какого-то действия за счёт проверки
#для_продвинутых
Думаю, вы заметили, что мы везде обрабатываем эту ошибку. Пока поток ожидает, кто-то может прервать его работу.
Thread.stop() это устаревший метод, который просто убивал поток. Сейчас есть Thread.interrupt() который говорит, что потоку надо закончить работу.Ещё можно приостановить работу во время выполнения какого-то действия за счёт проверки
!Thread.currentThread().isInterrupted().#для_продвинутых
👍6
Аргументы командной строки
Аргументы командной строки передается методу main в виде массива строк (String[] args). Когда вы запускаете программу Java из командной строки, вы можете передать дополнительные параметры после имени класса. Эти параметры будут доступны в виде элементов массива args.
#для_продвинутых
Аргументы командной строки передается методу main в виде массива строк (String[] args). Когда вы запускаете программу Java из командной строки, вы можете передать дополнительные параметры после имени класса. Эти параметры будут доступны в виде элементов массива args.
#для_продвинутых
👍9
#Вопросы_с_собеседования
🚩 Можете ли вы объяснить, как работает механизм 'Double Brace Initialization' в Java и в каких случаях его использование может быть неэффективным?
Механизм "Double Brace Initialization" в Java - это способ инициализации объектов, основанный на анонимных внутренних классах, где первые фигурные скобки создают анонимный подкласс, а вторые - блок инициализации. Этот подход может быть неэффективным из-за создания дополнительного класса для каждого использования, что увеличивает использование памяти и может затруднить чтение кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Конвертируем массив в список
— Принимает массив в качестве аргумента и возвращает объект типа
— Возвращаемый список имеет фиксированный размер, равный длине исходного массива. Добавлять/удалять элементы в него нельзя.
— Изменения в возвращаемом списке будут вноситься в исходный массив, т. к. список работает как "представление" массива. Метод работает для массивов примитивных и ссылочных типов.
Arrays.asList() — это статический метод класса Arrays, который позволяет конвертировать обычный массив в список List.— Принимает массив в качестве аргумента и возвращает объект типа
List с элементами этого массива. — Возвращаемый список имеет фиксированный размер, равный длине исходного массива. Добавлять/удалять элементы в него нельзя.
— Изменения в возвращаемом списке будут вноситься в исходный массив, т. к. список работает как "представление" массива. Метод работает для массивов примитивных и ссылочных типов.
Arrays.asList хорош для чтения элементов массива, но не для записи из-за неизменяемого размера.👍10🎄1
Micronaut
Micronaut — это современный фреймворк для создания микросервисных приложений на языке Java, Kotlin и Groovy. Он разрабатывался с учетом требований эффективности, производительности и легковесности.
— Легковесность: Micronaut предлагает низкоресурсное потребление благодаря тому, что многие операции выполняются во время компиляции, а не во время выполнения. Это позволяет создавать быстрые и эффективные приложения.
— Инъекция зависимостей во время компиляции: В отличие от многих других фреймворков, которые используют внедрение зависимостей во время выполнения, Micronaut выполняет внедрение зависимостей во время компиляции, что повышает производительность.
— Встроенная поддержка для микросервисной архитектуры: Micronaut предоставляет инструменты и функциональность для создания микросервисов, включая обработку HTTP-запросов, масштабирование и управление конфигурацией.
— Поддержка различных протоколов: Micronaut поддерживает различные протоколы взаимодействия, такие как HTTP, WebSocket, gRPC, RMI и многие другие.
— Встроенная поддержка тестирования: Фреймворк обеспечивает инструменты для написания и запуска тестов, что упрощает разработку надежных приложений.
Для подробной информации о Micronaut и примеров использования рекомендуется обратиться к официальной документации Micronaut.
#для_продвинутых
Micronaut — это современный фреймворк для создания микросервисных приложений на языке Java, Kotlin и Groovy. Он разрабатывался с учетом требований эффективности, производительности и легковесности.
— Легковесность: Micronaut предлагает низкоресурсное потребление благодаря тому, что многие операции выполняются во время компиляции, а не во время выполнения. Это позволяет создавать быстрые и эффективные приложения.
— Инъекция зависимостей во время компиляции: В отличие от многих других фреймворков, которые используют внедрение зависимостей во время выполнения, Micronaut выполняет внедрение зависимостей во время компиляции, что повышает производительность.
— Встроенная поддержка для микросервисной архитектуры: Micronaut предоставляет инструменты и функциональность для создания микросервисов, включая обработку HTTP-запросов, масштабирование и управление конфигурацией.
— Поддержка различных протоколов: Micronaut поддерживает различные протоколы взаимодействия, такие как HTTP, WebSocket, gRPC, RMI и многие другие.
— Встроенная поддержка тестирования: Фреймворк обеспечивает инструменты для написания и запуска тестов, что упрощает разработку надежных приложений.
Для подробной информации о Micronaut и примеров использования рекомендуется обратиться к официальной документации Micronaut.
#для_продвинутых
👍12🤔1
Вложенные классы
Вложенные классы (nested classes) представляют собой классы, объявленные внутри других классов. Вложенные классы могут быть статическими или нестатическими, и они могут использоваться для логической организации кода, повышения инкапсуляции и улучшения читаемости.
Статические вложенные классы (Static Nested Classes):
— Статический вложенный класс объявляется с использованием ключевого слова static.
— Он имеет доступ только к статическим членам внешнего класса и не имеет доступа к нестатическим членам.
— Статические вложенные классы используются, когда внутренний класс не зависит от экземпляра внешнего класса.
Внутренние классы (Inner Classes):
— Внутренние классы не объявляются с использованием ключевого слова static.
— Они имеют доступ ко всем членам внешнего класса, включая нестатические поля и методы.
— Внутренние классы могут быть обычными (обычные вложенные классы), анонимными или локальными.
#для_начинающих
Вложенные классы (nested classes) представляют собой классы, объявленные внутри других классов. Вложенные классы могут быть статическими или нестатическими, и они могут использоваться для логической организации кода, повышения инкапсуляции и улучшения читаемости.
Статические вложенные классы (Static Nested Classes):
— Статический вложенный класс объявляется с использованием ключевого слова static.
— Он имеет доступ только к статическим членам внешнего класса и не имеет доступа к нестатическим членам.
— Статические вложенные классы используются, когда внутренний класс не зависит от экземпляра внешнего класса.
Внутренние классы (Inner Classes):
— Внутренние классы не объявляются с использованием ключевого слова static.
— Они имеют доступ ко всем членам внешнего класса, включая нестатические поля и методы.
— Внутренние классы могут быть обычными (обычные вложенные классы), анонимными или локальными.
#для_начинающих
👍8
#Вопросы_с_собеседования
🎙️ Какие два класса не наследуются от Object?
Ответ:
Не ведитесь на провокации, нет таких классов: все классы прямо или через предков наследуются от класса Object!
Ответ:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍49😁11🤔1