💻 Hardware для Java-разработки в 2025
За последние несколько лет я видел всё: от героических попыток поднять Spring Boot на 4GB RAM до сборок, где дажехром со 100+ вкладками IDEA + микросервисы + инфра в докере не вешает систему.
🤔 Интересно узнать реальную картину по рынку.
Что компании реально предоставляют разработчикам? С какими конфигурациями вы работаете комфортно, а где начинаете упираться в потолок?
💬 Поделитесь опытом:
— Модель и конфигурация вашего рабочего ноутбука
— Достаточно ли мощности для ваших задач
🐸 Библиотека джависта
#DevLife
За последние несколько лет я видел всё: от героических попыток поднять Spring Boot на 4GB RAM до сборок, где даже
🤔 Интересно узнать реальную картину по рынку.
Что компании реально предоставляют разработчикам? С какими конфигурациями вы работаете комфортно, а где начинаете упираться в потолок?
— Модель и конфигурация вашего рабочего ноутбука
— Достаточно ли мощности для ваших задач
#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍5❤3😁2
В Java 8 появился CompletableFuture — это реализация паттерна Promise, которая позволяет строить декларативные цепочки асинхронных операций.
По сути, это обёртка над Future, которая может быть завершена вручную (отсюда "Completable") и предоставляет богатый API для композиции.
🔹 Зачем он нужен
Классический Future не позволяет:
— Комбинировать несколько асинхронных операций.
— Обрабатывать результат без блокировки.
— Реагировать на ошибки внутри цепочки.
CompletableFuture решает эти проблемы, предоставляя fluent API для композиции асинхронных вычислений.
🔹 Базовый пример
javaCompletableFuture<String> future = CompletableFuture
.supplyAsync(() -> fetchUserFromDB(userId))
.thenApply(user -> user.getEmail())
.thenApply(String::toUpperCase)
.exceptionally(ex -> "default@example.com");
future.thenAccept(System.out::println); // не блокирует
Здесь каждый этап выполняется асинхронно. Если где-то произошла ошибка, сработает exceptionally().
🔹 Ключевые методы
▪️ supplyAsync() / runAsync() — запустить задачу асинхронно.
▪️ thenApply() — трансформировать результат.
▪️ thenAccept() — обработать результат (void).
▪️ thenCompose() — развернуть вложенный CompletableFuture.
▪️ thenCombine() — объединить результаты двух независимых future.
▪️ exceptionally() / handle() — обработка ошибок.
▪️ allOf() / anyOf() — дождаться завершения нескольких задач.
🔹 Пулы потоков
По умолчанию CompletableFuture использует ForkJoinPool.commonPool(). Для задач с блокирующими операциями (IO, БД) лучше передать свой Executor. Иначе можно заблокировать общий пул и замедлить всё приложение.
🔹 Подводные камни
— Отсутствие отмены
CompletableFuture.cancel() не останавливает выполнение задачи, а только меняет статус. Реальная отмена требует проверки Thread.interrupted() внутри задачи.
— Проглатывание исключений
Если не добавить exceptionally() или handle(), исключение останется внутри future до вызова get() или join().
— Цепочки могут выполняться синхронно
Методы без суффикса Async (например, thenApply) могут выполниться в том же потоке, где завершился предыдущий этап. Если нужна гарантия асинхронности, используйте thenApplyAsync().
— Для композиции нескольких асинхронных операций (API-вызовы, запросы в БД).
— Когда нужны неблокирующие обработчики результатов.
— В реактивных архитектурах (хотя там лучше Project Reactor или RxJava).
— Для CPU-bound задач с высокой конкуренцией (лучше использовать параллельные стримы или явное управление потоками).
— Когда важна отмена выполняющейся задачи.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2❤1