Please open Telegram to view this post
VIEW IN TELEGRAM
DelayQueue — это потокобезопасная очередь из java.util.concurrent, где элементы становятся доступными только после истечения заданного времени задержки. Элементы должны реализовывать интерфейс Delayed.Она удобна для отложенной обработки задач — таймеров, кэшей с TTL, планировщиков.
• Элементы выдаются только после задержки
• Работает в многопоточном режиме
• Идеальна для задач с таймаутами
import java.util.concurrent.*;
class Task implements Delayed {
long start = System.currentTimeMillis() + 1000;
public long getDelay(TimeUnit u) { return u.convert(start - System.currentTimeMillis(), TimeUnit.MILLISECONDS); }
public int compareTo(Delayed o) { return Long.compare(getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS)); }
public String toString() { return "Задача выполнена"; }
}
public class Main {
public static void main(String[] args) throws Exception {
DelayQueue<Task> q = new DelayQueue<>();
q.put(new Task());
System.out.println(q.take()); // ждём 1 сек
}
}
👀 DelayQueue особенно полезна для отложенных задач, TTL-кэшей и планировщиков.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2
Снова показываю как можно вести разработку «голыми руками» — без IDE, документации и даже интернета. На этот раз с помощью «пользовательской» Ubuntu Linux и OpenJDK.
Please open Telegram to view this post
VIEW IN TELEGRAM
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