Základní principy multi-threadingu

Optimalizace kódu v Javě

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Sekvenční vs. paralelní spuštění

  • Sekvenční zpracování -> operace probíhají jedna po druhé
  • Paralelní zpracování -> více operací probíhá současně

Jak?

  • Moderní CPU mají více jader
  • Vlákno: nejmenší jednotka spuštění programu
  • Multi-threading rozděluje práci mezi tato jádra

Jednovláknové zpracování je jako jednopruhová silnice, kde auta jezdí za sebou. Multi-threading je jako vícepruhová silnice, kde auta jedou souběžně!

Optimalizace kódu v Javě

Použití vláken

  • Třída Thread umožňuje vytváření nových cest spuštění
  • Každé vlákno Thread může běžet nezávisle
Runnable task = () -> {
    System.out.println("Processing on thread: " + 
                       Thread.currentThread().getName());
};

Thread thread = new Thread(task);
thread.start();
Processing on thread: Thread-0
Optimalizace kódu v Javě

Práce s více vlákny

List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < 4; i++) {
    Thread thread = new Thread(() -> System.out.println("Processing data on Thread-" + i));
    threads.add(thread);
    thread.start();
}

for (Thread t : threads) {
    t.join(); // Waits for all threads to complete
}
// Processing data on Thread-0
// Processing data on Thread-2
// Processing data on Thread-1
// Processing data on Thread-3
Optimalizace kódu v Javě

Paralelní streamy

  • Streamy – funkce Javy 8+ pro zjednodušený paralelismus
  • Automaticky spravuje vytváření a správu vláken
  • Dva způsoby vytvoření:
    • collection.parallelStream()
    • Stream.of(...).parallel()
Optimalizace kódu v Javě

Příklad paralelních streamů

// Sequential processing
List<Integer> result1 = new ArrayList<>();
for (int i = 0; i < numbers.size(); i++) {
    result1.add(numbers.get(i) * 2);
}

// Sequential processing with stream List<Integer> result2 = numbers.stream() .map(n -> n * 2) .collect(Collectors.toList());
// Parallel processing with parallel stream List<Integer> result3 = numbers.parallelStream() .map(n -> n * 2) .collect(Collectors.toList());
Optimalizace kódu v Javě

Kdy použít paralelní zpracování

  • Operace náročné na CPU
  • Nezávislé zpracování dat
  • Velké datové kolekce
  • Dostupná jádra CPU > 1
  • Režie paralelizace se nemusí vyplatit pro:
    • Malé datové sady
    • Jednoduché operace
Optimalizace kódu v Javě

Shrnutí

  • Třída Thread pro vytváření paralelních cest spuštění
  • Paralelní streamy pro zjednodušené zpracování kolekcí
  • Přínosy závisí na:
    • Typu zátěže
    • Velikosti dat
    • Dostupných jádrech
Optimalizace kódu v Javě

Pojďme cvičit!

Optimalizace kódu v Javě

Preparing Video For Download...