Ottimizzazione del codice in Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
Creare thread è costoso!
$$
Thread pool:
ExecutorService// 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();
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();
// 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();
CompletableFutureFunction// 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);
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