Please open Telegram to view this post
VIEW IN TELEGRAM
😁13
Что такое ThreadLocal в Java и когда его стоит использовать?
Пример
public class Main {
private static final ThreadLocal<Integer> threadId =
ThreadLocal.withInitial(() -> (int) (Math.random() * 1000));
public static void main(String[] args) {
Runnable task = () ->
System.out.println(Thread.currentThread().getName() + " → " + threadId.get());
new Thread(task, "Поток-1").start();
new Thread(task, "Поток-2").start();
new Thread(task, "Поток-3").start();
}
}Ответ
ThreadLocal хранит данные отдельно для каждого потока. Даже если переменная одна, каждый поток получает свою копию.
📌 Применения:
— хранение пользовательских сессий в веб-приложениях
— уникальные ID запросов в логах
— объекты, которые нельзя шарить между потоками (например, SimpleDateFormat).
Но важно не забывать вызывать remove(), чтобы избежать утечек памяти в пуле потоков.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
PriorityBlockingQueue — это потокобезопасная очередь из java.util.concurrent, которая хранит элементы в отсортированном виде согласно их приоритету.Она активно используется в задачах, где нужно управлять порядком обработки — например, в планировщиках, системах обработки задач и диспетчерах потоков.
• Элементы автоматически сортируются
• Работает в многопоточном режиме
• Подходит для диспетчеризации задач по приоритету
import java.util.concurrent.PriorityBlockingQueue;
public class Main {
public static void main(String[] args) {
PriorityBlockingQueue<Integer> queue = new PriorityBlockingQueue<>();
queue.add(5);
queue.add(1);
queue.add(3);
while (!queue.isEmpty()) {
System.out.println(queue.poll()); // ➔ 1, 3, 5
}
}
}
👀 PriorityBlockingQueue особенно полезна, когда задачи имеют приоритеты — например, обработка срочных запросов, планирование задач или распределение ресурсов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Мы знаем, как это бывает: проект на Java 8 живёт уже десятый год, релизить страшно, тестов мало, миграция пугает, а система критичная. И вот бизнес хочет «ускорить и не трогать».
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😭19😁7
Что такое Future в Java и какие у него ограничения?
Пример
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(() -> {
Thread.sleep(1000);
return 42;
});
System.out.println("Результат: " + future.get()); // блокируется, пока не готово
executor.shutdown();
}
}
Ответ
Future используется для представления результата асинхронной задачи. С его помощью можно запустить вычисление в отдельном потоке и позже получить результат через get().
Ограничения Future:
— нельзя легко комбинировать несколько задач
— нет встроенной обработки ошибок
— вызов get() блокирует поток, пока результат не готов
📌 Эти ограничения решаются с помощью CompletableFuture, который поддерживает цепочки и реактивный стиль.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
LinkedBlockingQueue — это потокобезопасная очередь из пакета java.util.concurrent, реализованная на связном списке.Очередь блокирует операции добавления, если достигнут лимит, и операции извлечения, если очередь пуста. Это делает её удобным инструментом для синхронизации потоков.
• Поддерживает опциональный лимит размера
• Автоматически блокирует при пустой/полной очереди
• Идеальна для producer-consumer сценариев
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
BlockingQueue<String> queue = new LinkedBlockingQueue<>(2);
Runnable producer = () -> {
try {
queue.put("task-1");
queue.put("task-2");
System.out.println("Продюсер добавил задачи");
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Runnable consumer = () -> {
try {
System.out.println("Консьюмер обработал: " + queue.take());
System.out.println("Консьюмер обработал: " + queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(producer).start();
new Thread(consumer).start();
}
}
👀 LinkedBlockingQueue особенно полезна для построения очередей задач в многопоточных приложениях, ограниченного буферинга и потокобезопасной коммуникации между потоками.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🤯1
Stable Values - новая возможность, которая появится в Java 25 — следующем LTS-релизе, намеченном на сентябрь.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁29❤5
Что такое Callable в Java и чем он отличается от Runnable?
Пример
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Integer> task = () -> {
Thread.sleep(500);
return 7 * 6;
};
Future<Integer> future = executor.submit(task);
System.out.println("Результат: " + future.get()); // ➔ 42
executor.shutdown();
}
}
Ответ
Runnable — это интерфейс для задач, которые выполняются в отдельном потоке, но не возвращают результат и не могут выбрасывать проверяемые исключения.
Callable<V> — это интерфейс для задач, которые возвращают результат (V) и могут выбрасывать исключения.
📌 Основные отличия:
—Runnable.run () → void, без checked-исключений
—Callable.call () → V, может выбросить checked-исключения
— Callable всегда используется вместе с Future для получения результата
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1