Библиотека Java разработчика
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP
Show more📈 Analytical overview of Telegram channel Библиотека Java разработчика
Channel Библиотека Java разработчика (@bookjava) in the Russian language segment is an active participant. Currently, the community unites 10 279 subscribers, ranking 12 030 in the Technologies & Applications category and 63 913 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 10 279 subscribers.
According to the latest data from 05 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by 20 over the last 30 days and by 0 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 8.29%. Within the first 24 hours after publication, content typically collects 3.77% reactions from the total number of subscribers.
- Post reach: On average, each post receives 852 views. Within the first day, a publication typically gains 388 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 6.
- Thematic interests: Content is focused on key topics such as string, интерфейс, строка, boot, api.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.
По всем вопросам @evgenycarter
РКН clck.ru/3KoGeP”
Thanks to the high frequency of updates (latest data received on 06 June, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
import java.net.*;
public class GetPreferredIP {
public static void main(String[] args) throws SocketException {
try (final DatagramSocket socket = new DatagramSocket()) {
socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
System.out.println(socket.getLocalAddress().getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
Сервер не получает эти данные, однако этот метод поможет определить предпочтительный локальный IP-адрес.
Мы в MAX
👉@BookJava
import java.net.*;
public class GetIP {
public static void main(String[] args) throws UnknownHostException {
System.out.println(InetAddress.getLocalHost().getHostAddress());
}
}
Работа с несколькими сетевыми интерфейсами
Если ваш компьютер оснащён несколькими сетевыми интерфейсами, иногда бывает необходимо обойти весь список интерфейсов и отфильтровать адреса, не являющиеся обратными петлями и являющиеся локальными для сайта. Это особенно актуально при работе в средах с многочисленными сетями.
import java.net.*;
import java.util.*;
public class GetMultiIPs {
public static void main(String[] args) throws SocketException {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface iface = interfaces.nextElement();
if (iface.isLoopback() || !iface.isUp()) continue;
Enumeration<InetAddress> addresses = iface.getInetAddresses();
while(addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if (addr instanceof Inet4Address) {
System.out.println(iface.getDisplayName() + " – " + addr.getHostAddress());
}
}
}
}
}
Мы в MAX
👉@BookJavaclone() должен вызываться super.clone();
✔️ Если какой-либо член класса не поддерживает клонирование, то в методе клонирования необходимо создать новый экземпляр этого класса и скопировать каждый его член со всеми атрибутами в новый объект класса, по одному.
Мы в MAX
👉@BookJava
public class API {
public static void enableLogging(boolean enable) {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
System.setProperty("log", String.valueOf(enable));
return null;
}
});
}
public static void runTask(Runnable task) {
try {
task.run();
} catch (ThreadDeath td) {
System.out.println("Task stopped.");
}
}
}
public class Service {
public static void log(String message) {
String shouldLog = System.getProperty("log", "true");
if (new Boolean("log")) {
System.out.print(message);
}
}
}
https://egahlin.github.io/2024/05/31/deprecated-event.html
Мы в MAX
👉@BookJava
# application.yml
spring:
threads:
virtual:
enabled: true # MVC, @Async, schedulers получат VirtualThreadPerTaskExecutor
📌 Ручной контроль (если нужен кастом)
@Bean
TaskExecutor vthreads() {
return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
}
// Привязать к @Async по умолчанию:
@Bean(name = {TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME})
TaskExecutor appExecutor() { return vthreads(); }
💡 Tomcat под Loom (MVC)
server:
tomcat:
threads:
max: 200 # это число платформенных (!) потоков, оставьте умеренным
💡 JDBC и пул соединений
Виртуальные потоки не отменяют лимиты БД. Не раздувайте пул, наоборот:
spring:
datasource:
hikari:
maximum-pool-size: 20 # ориентируйтесь на лимиты БД/кейсы, а не на «тысячи» v-threads
minimum-idle: 5
⚠️ Три частые ошибки
1. ThreadLocal-засады. Виртуальные потоки дешёвые, но ThreadLocal всё так же утекает. Используйте @Transactional /Context Propagation или ScopedValue вместо самодельных ThreadLocal.
2. Блокирующие HTTP-клиенты. Для массового I/O берите HttpClient (JDK) или WebClient c ограничением пула сокетов; не плодите соединения до бесконечности — узкое место сеть/БД.
3. Метрики и трейсинг. Обновите Micrometer/Brave до версий, корректно работающих с виртуальными потоками, и включите @Observed — без этого дебаг станет болью.
✅ Когда включать?
- Много блокирующего I/O (JDBC, REST к внешним сервисам) → почти всегда плюс.
- Чисто CPU-bound → выгоды мало, но и вреда нет.
Бонус: быстрый smoke-тест
IntStream.range(0, 10_000).parallel()
.forEach(i -> RestClient.create().get().uri("https://example.com").retrieve().toBodilessEntity());
С Virtual Threads сервер не «захлебнётся» потоками — упадёте ровно в реальные лимиты: БД, сеть, таймауты. Мониторьте их, а не «число потоков».
👉@BookJava
Available now! Telegram Research 2025 — the year's key insights 
