Geavanceerde threadingpatronen

Code optimaliseren in Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Basis van threadpools

Threads aanmaken is duur!

$$

Threadpools:

  • Hergebruiken bestaande threads
  • Beheren het aantal gelijktijdige threads
  • Worden beheerd via de ExecutorService-interface
Code optimaliseren in Java

Threadpools maken

// Vaste threadpool met 4 threads
ExecutorService fixedPool = Executors.newFixedThreadPool(4);


// Cached threadpool die groeit indien nodig ExecutorService cachedPool = Executors.newCachedThreadPool();
// Single-threaded executor ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
Code optimaliseren in Java

Taken indienen

ExecutorService executor = Executors.newFixedThreadPool(4);

// Taak indienen zonder returnwaarde
executor.execute(() -> System.out.println("Eenvoudige taak"));

// Taak indienen met returnwaarde (Callable)
Future<Integer> future = executor.submit(() -> {
    Thread.sleep(1000);
    return 42;
});

// Resultaat uit Future ophalen (blokkeert tot voltooid)
int result = future.get();
Code optimaliseren in Java

Executors afsluiten

// Afsluiting starten, bestaande taken gaan door
executor.shutdown();


// Wachten op beëindiging (met timeout) boolean terminated = executor.awaitTermination(5, TimeUnit.SECONDS);
// Direct geforceerd afsluiten, lopende taken annuleren executor.shutdownNow();
Code optimaliseren in Java

De completable future

  • CompletableFuture
  • Onderdeel van Java's concurrency-API sinds Java 8
  • Moderne aanpak voor asynchrone programmering
  • Kan handmatig of via een Function worden voltooid
  • Maakt ketenen met callbacks mogelijk
  • Werkt met of zonder expliciete threadpools
Code optimaliseren in Java

Completable futures maken

// Async uitvoeren met standaard executor
CompletableFuture<Void> runAsync = 
    CompletableFuture.runAsync(() -> performTask());

// Async leveren met eigen executor ExecutorService executor = Executors.newCachedThreadPool(); CompletableFuture<String> supplyAsync = CompletableFuture.supplyAsync(() -> fetchData(), executor);
Code optimaliseren in Java

Operaties ketenen

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

// Toegang tot resultaat zodra gereed
future.thenAccept(result -> System.out.println(result));
Code optimaliseren in Java

Laten we oefenen!

Code optimaliseren in Java

Preparing Video For Download...