Продвинутые паттерны многопоточности

Оптимизация кода на Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Основы пула потоков

Создание потоков — дорогостоящая операция!

$$

Пулы потоков:

  • Повторно используют существующие потоки
  • Контролируют количество параллельных потоков
  • Управляются через интерфейс ExecutorService
Оптимизация кода на Java

Создание пулов потоков

// Fixed thread pool with 4 threads
ExecutorService fixedPool = Executors.newFixedThreadPool(4);


// Cached thread pool that grows as needed ExecutorService cachedPool = Executors.newCachedThreadPool();
// Single-threaded executor ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
Оптимизация кода на Java

Отправка задач

ExecutorService executor = Executors.newFixedThreadPool(4);

// Submit a task with no return value
executor.execute(() -> System.out.println("Simple task"));

// Submit a task with a return value (Callable)
Future<Integer> future = executor.submit(() -> {
    Thread.sleep(1000);
    return 42;
});

// Get result from Future (blocks until complete)
int result = future.get();
Оптимизация кода на Java

Завершение работы исполнителей

// Signal shutdown, but continue running existing tasks
executor.shutdown();


// Wait for termination (with timeout) boolean terminated = executor.awaitTermination(5, TimeUnit.SECONDS);
// Force immediate shutdown, canceling running tasks executor.shutdownNow();
Оптимизация кода на Java

CompletableFuture

  • CompletableFuture
  • Часть API параллелизма Java, начиная с Java 8
  • Современный подход к асинхронному программированию
  • Может завершаться вручную или через Function
  • Поддерживает цепочки операций с обратными вызовами
  • Работает как с явными пулами потоков, так и без них
Оптимизация кода на Java

Создание CompletableFuture

// Run async with default executor
CompletableFuture<Void> runAsync = 
    CompletableFuture.runAsync(() -> performTask());

// Supply async with custom executor ExecutorService executor = Executors.newCachedThreadPool(); CompletableFuture<String> supplyAsync = CompletableFuture.supplyAsync(() -> fetchData(), executor);
Оптимизация кода на Java

Цепочки операций

CompletableFuture<String> future = CompletableFuture
    .supplyAsync(() -> fetchUserData(userId))
    .thenApply(data -> extractUsername(data))
    .exceptionally(ex -> "Unknown user");

// Access to result when ready
future.thenAccept(result -> System.out.println(result));
Оптимизация кода на Java

Давайте потренируемся!

Оптимизация кода на Java

Preparing Video For Download...