Pattern avanzati di threading

Ottimizzazione del codice in Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Fondamenti dei thread pool

Creare thread è costoso!

$$

Thread pool:

  • Riutilizzano thread esistenti
  • Controllano il numero di thread concorrenti
  • Si gestiscono con l'interfaccia ExecutorService
Ottimizzazione del codice in Java

Creare thread pool

// Thread pool fisso con 4 thread
ExecutorService fixedPool = Executors.newFixedThreadPool(4);


// Thread pool cache che cresce al bisogno ExecutorService cachedPool = Executors.newCachedThreadPool();
// Executor a singolo thread ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
Ottimizzazione del codice in Java

Inviare task

ExecutorService executor = Executors.newFixedThreadPool(4);

// Invia un task senza valore di ritorno
executor.execute(() -> System.out.println("Simple task"));

// Invia un task con valore di ritorno (Callable)
Future<Integer> future = executor.submit(() -> {
    Thread.sleep(1000);
    return 42;
});

// Ottieni il risultato dal Future (blocca fino al completamento)
int result = future.get();
Ottimizzazione del codice in Java

Arrestare gli executor

// Segnala lo shutdown, ma continua i task in corso
executor.shutdown();


// Attendi la terminazione (con timeout) boolean terminated = executor.awaitTermination(5, TimeUnit.SECONDS);
// Forza lo shutdown immediato, annullando i task in esecuzione executor.shutdownNow();
Ottimizzazione del codice in Java

Il completable future

  • CompletableFuture
  • Parte dell'API di concorrenza da Java 8
  • Approccio moderno alla programmazione asincrona
  • Può essere completato manualmente o via Function
  • Permette di concatenare operazioni con callback
  • Funziona con o senza thread pool espliciti
Ottimizzazione del codice in Java

Creare completable future

// Esegui async con executor predefinito
CompletableFuture<Void> runAsync = 
    CompletableFuture.runAsync(() -> performTask());

// Fornisci async con executor personalizzato ExecutorService executor = Executors.newCachedThreadPool(); CompletableFuture<String> supplyAsync = CompletableFuture.supplyAsync(() -> fetchData(), executor);
Ottimizzazione del codice in Java

Concatenare operazioni

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

// Accedi al risultato quando pronto
future.thenAccept(result -> System.out.println(result));
Ottimizzazione del codice in Java

Ayo berlatih!

Ottimizzazione del codice in Java

Preparing Video For Download...