Java for Beginner
869 subscribers
1.01K photos
275 videos
14 files
1.69K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
🗓 История IT сегодня — 20 августа


ℹ️ Кто родился в этот день

Том Демарко (также ДеМарко, род. 20 августа 1940 года, Хейзлтон, штат Пенсильвания, США) — классик инженерии ПО; «Peopleware», структурный анализ, влияние на практику менеджмента проектов.

Мартин Догиамас (Martin Dougiamas 1969) — основатель Moodle, одной из самых распространённых LMS в мире.

Эрик Голес Чакк (Антофагаста, 21 августа 1951) — учёный в области дискретной математики и клеточных автоматов, лауреат премий за вклад в информатику Чили.


🌐 Знаковые события

1912 — Томас Эдисон патентует электробатарею.

1956 — Начала действовать ядерная электростанция «Колдер Холл», первая ядерная электростанция Британии.

1964 — Основан Интелсат — компания, владеющая группировкой телекоммуникационных спутников.

1975 — запуск американской межпланетной станции Viking 1 к Марсу.

2024 — прекращена работа мессенджера «Агент
Mail.ru» (пользователям предложено перейти на VK).


#Biography #Birth_Date #Events #20Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
[Совет по Java #073]

Тема: BlockingQueue методы put() и take() блокируются, а offer() и poll() с таймаутом — нет.

Проблема: Классы, реализующие BlockingQueue (например, ArrayBlockingQueueLinkedBlockingQueue), предоставляют два набора методов для добавления и извлечения элементов.

Методы put() и take() блокируют поток до тех пор, пока не появится возможность выполнить операцию (для put() — пока не освободится место, для take() — пока не появится элемент).

Методы offer() и poll() являются неблокирующими: они пытаются выполнить операцию и сразу возвращают результат (true/false или элемент/null).

Существуют также перегруженные версии offer(e, timeout, unit) и poll(timeout, unit), которые ожидают указанное время и затем возвращают результат. Разработчики часто путают их, полагая, что put() и take() — это просто синонимы, и используют их в ситуациях, где нужна неблокирующая проверка, что приводит к зависанию потоков. В других случаях они используют offer() и poll() без таймаута, когда нужно дождаться освобождения места или появления элемента, что приводит к частым повторным попыткам и busy-wait.

Решение: Четко различайте сценарии использования. Если поток должен ждать неопределенно долго, пока операция не станет возможной — используйте put() и take().

Если вы хотите только попытаться выполнить операцию и немедленно вернуть результат — используйте offer() и poll() без таймаута. Если нужно ожидать в течение ограниченного времени, а затем отступить — используйте перегруженные версии с таймаутом и обязательно проверяйте возвращаемое значение: offer возвращает true при успешной вставке, poll возвращает null при отсутствии элемента по истечении таймаута. Всегда обрабатывайте случай null или false, чтобы избежать NullPointerException или бесконечных циклов.

В многопоточных приложениях предпочтительнее использовать таймауты, чтобы система могла корректно реагировать на перегрузки и завершать потоки.
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

public class BlockingQueueMethods {

private final BlockingQueue<String> queue = new ArrayBlockingQueue<>(1);

//Опасный вариант: put() блокирует навсегда
public void badPut() throws InterruptedException {
queue.put("item"); // Если очередь полна, поток зависнет навсегда
// Никогда не вернется, если никто не потребит
}

//Правильно: try с таймаутом
public boolean safeOffer(String item) throws InterruptedException {
if (queue.offer(item, 1, TimeUnit.SECONDS)) {
System.out.println("Элемент добавлен");
return true;
} else {
System.out.println("Очередь заполнена, таймаут");
return false;
}
}

//Опасный вариант: poll() без таймаута возвращает null немедленно
public String badPoll() {
return queue.poll(); // null, если очередь пуста — нужно проверять!
}

//Блокирующее извлечение, когда нужно ждать
public String takeItem() throws InterruptedException {
return queue.take(); // ждет, пока появится элемент
}

//Извлечение с таймаутом
public String pollWithTimeout() throws InterruptedException {
String item = queue.poll(500, TimeUnit.MILLISECONDS);
if (item != null) {
System.out.println("Получен: " + item);
} else {
System.out.println("Таймаут, элемент не появился");
}
return item;
}
}


Объяснение:
 put() и take() используют внутренние условия (Condition) для блокировки, освобождая монитор и вновь захватывая его после пробуждения. Они не возвращают управление до выполнения операции. offer() и poll() без таймаута проверяют состояние очереди и немедленно возвращают результат. Версии с таймаутом реализованы через циклы с ожиданием, но прерываются по истечении времени.

При использовании таймаутов всегда проверяйте возвращаемые значения, чтобы отличить успех от таймаута (для offer — false, для poll — null). Важно также помнить, что null может быть допустимым значением в некоторых очередях (например, LinkedTransferQueue), но в стандартных реализациях null не разрешен, поэтому null однозначно указывает на таймаут.


#Java #советы
👍3
Что выведет код?

import java.util.concurrent.*;

public class Task200826 {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(1);
queue.put(1);

Thread consumer = new Thread(() -> {
try {
Thread.sleep(2000);
queue.take();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
consumer.start();

boolean added = queue.offer(2, 1, TimeUnit.SECONDS);
System.out.println(added);
System.out.println(queue.size());
}
}


#Tasks
👍4
Варианты ответа:
Anonymous Quiz
29%
true 1
0%
true 2
29%
false 0
43%
false 1
👍1
Ждете?

Скоро))) 😜
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2
Что такое Circuit Breaker и какую роль играет в микросервисах? 🤓

Ответ:

Circuit Breaker (паттерн, реализованный в Resilience4j, Hystrix) — защищает систему от каскадных отказов. Он отслеживает вызовы внешних сервисов.

Если количество неудачных вызовов превышает порог, цепь размыкается (open) — все последующие вызовы немедленно возвращают ошибку (или fallback), не делая запроса. Через некоторое время цепь переходит в полуоткрытое (half-open) состояние — пропускает пробные запросы, и если они успешны, цепь снова замыкается.

Это предотвращает тайм-ауты и перегрузку сбойных сервисов, давая им время восстановиться.



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
19. Read Model на событиях: выбор между JOIN, REST, Replica и CQRS

В этом видео я разбираю реальный вызов: бизнес хочет аналитику по жизненному циклу заказа – время создания, оплаты, отправки уведомления. Данные живут в трёх независимых микросервисах (Order, Payment, Notification) у двух из которых свои базы данных.

Как построить аналитику, не нарушая инкапсуляцию и не создавая синхронной связанности?

Я пройду через все популярные альтернативы:
🔹 SQL JOIN между базами – почему это антипаттерн
🔹REST-агрегация – почему не масштабируется
🔹Read Replica – почему не решает проблему агрегации
🔹CDC → ClickHouse – когда это оправдано, а когда избыточно
🔹CQRS + Event‑driven Read Model Projection – наш выбор и его цена

Я не просто показываю «как сделать CQRS», а объясняю процесс принятия решения: оцениваю стоимость, производительность, надёжность, сложность и поддерживаемость.

Что вы узнаете:
🔹Как отличить операционную аналитику от OLAP-хранилища
🔹Почему CQRS – это не «две базы данных», а принцип разделения команд и запросов
🔹Как строить идемпотентные проекции с помощью INSERT ... ON CONFLICT
🔹Как защитить read-модель от старых событий
🔹Как оценивать архитектурные альтернативы по таблице критериев

Исходный код проекта на GitHub наверняка заслуживает Ваших звезд! 🙂

Ссылка на Youtube
Ссылка на Рутьюб

Смотрите, ставьте лайки, подписывайтесь на каналы!✌️

Жду ваших реакций и оценок
🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍2🤯1
🗓 История IT сегодня — 21 августа


ℹ️ Кто родился в этот день

Серге́й Брин (англ. Sergey Brin; род. 21 августа 1973, Москва, СССР) — американский программист и интернет-предприниматель. Вместе с Ларри Пейджем он стал создателем Google и одноимённой крупнейшей в мире поисковой системы. Брин был президентом Alphabet Inc., материнской компании Google, пока не ушёл с этой должности 3 декабря 2019 года. Брин и Пейдж остаются в Alphabet в качестве соучредителей, контролирующих акционеров, членов совета директоров и сотрудников. По данным Форбс 2025 года, Брин занимает 8-е место в списке самых богатых людей в мире ($110B).

Джон Д. Кармак II (англ. John D. Carmack II; род. 21 августа 1970 года, Канзас, США) — американский разработчик компьютерных игр; инженер в областях информатики, аэрокосмической техники и виртуальной реальности; предприниматель, соучредитель и совладелец компаний id Software и Armadillo Aerospace. В 1991 году Кармак стал одним из основателей компании id Software, которая прославилась разработкой основополагающих игр в жанре FPS — Wolfenstein 3D, Doom, Quake, — ведущим программистом которых был Кармак. Его революционные методы программирования и уникальные дизайнерские решения Джона Ромеро способствовали популярности этого жанра в 1990-х годах.

Стивен Макконнелл Кейс (родился 21 августа 1958 года) — со-основатель и CEO AOL; один из драйверов массового выхода пользователей в интернет в 1990-х.


🌐 Знаковые события

1888 — патент У. С. Бэрроуза на счётную машину. Важная веха в линии, ведущей к офисной механизации и ранним вычислительным устройствам.

1957 — первый успешный пуск МБР Р-7 с Байконура. Полёт на ~6000–6500 км до Камчатки; именно этот носитель стал «прародителем» спутниковых и пилотируемых ракет семейства «Союз». 27 августа ТАСС официально сообщил об успешном испытании.

1965 — старт Gemini 5 (NASA). Первый длительный полёт по программе Gemini (8 суток), ключевая проверка топливных элементов как источника энергии для лунных экспедиций.

1989 — исследовательский зонд «Вояджер-2» делает снимки Тритона, спутника планеты Нептун.

2006 — началась регистрация доменных имён в новом домене общего пользования .mobi, предназначенном для мобильных устройств.


#Biography #Birth_Date #Events #21Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Раздел 12. Работа с файлами, I/O и сетью (NIO.2)

Глава 4. Работа с сетью (Socket, HTTP, HttpClient)

Тема: HttpClient в Java 11+: современный HTTP-клиент

Читаем на devforge.ru - ссылка, тык


#Java #для_новичков #beginner #HttpClient #http
👍1
Что выведет код?

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Task210826 {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/post"))
.POST(HttpRequest.BodyPublishers.ofString("data"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
}
}


#Tasks
👍1
Что такое Retry паттерн и как его реализовать в Spring? 🤓

Ответ:

Retry (повтор) — паттерн для повторных попыток выполнения операции в случае временных сбоев (сетевые проблемы, блокировки БД).

В Spring реализован через 
@Retryable (Spring Retry).

Параметры: maxAttempts, backoff (задержка между попытками, с экспоненциальным увеличением).

Пример: 
@Retryable(value = SQLException.class, maxAttempts = 3, backoff = @Backoff(delay = 1000)).

Важно: использовать с idempotent операциями (повтор безопасен). Интегрируется с Circuit Breaker (например, Resilience4j).



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2