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
Please open Telegram to view this post
VIEW IN TELEGRAM
StampedLock — это продвинутый механизм синхронизации из пакета
java.util.concurrent.locks, созданный как альтернатива ReentrantReadWriteLock.Он предоставляет три режима блокировки:
• эксклюзивная (write lock)
• совместная (read lock)
• оптимистичная (optimistic read), которая не блокирует ресурс и подходит для случаев, где конфликты редки.
Вместо объектов-блокировок StampedLock работает с "штампами" (stamp) — уникальными long-значениями, которые нужно передавать при освобождении блокировки
• Позволяет снизить блокировки при частых чтениях
• Поддерживает неблокирующие "оптимистичные" чтения
• Эффективнее для высоконагруженных многопоточных приложений
import java.util.concurrent.locks.StampedLock;
public class Main {
private static final StampedLock lock = new StampedLock();
private static int value = 0;
public static void main(String[] args) {
// Запись
long stamp = lock.writeLock();
try {
value = 42;
} finally {
lock.unlockWrite(stamp);
}
// Оптимистичное чтение
long optStamp = lock.tryOptimisticRead();
int readValue = value;
if (!lock.validate(optStamp)) {
long readStamp = lock.readLock();
try {
readValue = value;
} finally {
lock.unlockRead(readStamp);
}
}
System.out.println("Прочитано: " + readValue);
}
}
👀 StampedLock особенно полезен в сценариях с частыми чтениями и редкими записями, например, в кэшах, аналитических сервисах или многопоточных коллекциях, где важна высокая производительность при одновременном доступе
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Сегодня я хочу рассказать вам об одном из вариантов доставки событий для распределённого приложения на Java.
Это доставка событий через БД, в которой хранится состояние распределённого приложения.
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
😁11🤔3❤2🔥1
Что такое Daemon-потоки в Java и чем они отличаются от обычных?
Пример
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread daemon = new Thread(() -> {
while (true) {
System.out.println("Демон работает...");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
break;
}
}
});
daemon.setDaemon(true); // делаем поток демоном
daemon.start();
Thread.sleep(1500);
System.out.println("Главный поток завершён");
}
}Ответ
Обычные (user) потоки удерживают JVM «живой», пока они выполняются.
Daemon-потоки — это «служебные» потоки, которые автоматически завершаются, когда все пользовательские потоки завершены.
📌 Применения:
— сборка мусора (GC в JVM — это демон)
— фоновые задачи (логирование, мониторинг)
— вспомогательные сервисы, не критичные для завершения программы
Важно: daemon-потоки могут быть остановлены в любой момент при завершении JVM, поэтому их нельзя использовать для критически важных операций (например, записи в БД).
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM