Seminář 3 - Paralelní programování
Zdroje
- K dnešnímu semináři není dostupný obvyklý text umožňující přímočarou náhradu samostudiem.
- Concurrency
- Minimálně si přečtěte tyto sekce (včetně jejich podsekcí!):
- Processes and Threads
- Thread Objects
- Synchronization
- Executors
- Atomic Variables
- Minimálně si přečtěte tyto sekce (včetně jejich podsekcí!):
- Herbert Schildt, 2022
- Java, The complete Reference, Twelfth Edition
- Knihovna PřF: M2/1756
- Part I, Chapter 11 (pp. 247 - 276)
- Part II, Chapter 29 (pp. 955 - 1004)
- Zdrojové kódy z hodiny.
Poznámka k virtuálním vláknům
- V ukázkách pracujeme s klasickými (platformovými) vlákny, což byla do Java 20 jediná možnost.
- Nově Java 21 nabízí i virtuální vlákna.
- Normální (tj. platformové) vlákno je mapované 1:1 na vlákno OS - když čeká Java vlákno, čeká i OS vlákno.
- U virtuálních vláken může více virtuálních vláken sdílet jedno OS vlákno - pokud čeká Java vlákno, tak OS vlákno může využívat někdo jiný.
- Hodí se, pokud vlákna často čekají (např. IO operace).
- Pro detaily se podívejte na odkaz výše.
- Použití je obdobné jako v kódech dnešní ukázky.
- Vlákna vytváříte přes Buildery
Thread.Builder
, tj.Thread.ofVirtual
aThread.ofPlatform
. - Pooly pak pomocí
Executors.newVirtualThreadPerTaskExecutor()
. - Malá ukázka vytváření je i v kódech.
Úkol č. 3
- Vyřešené úkoly zašlete do 5.3.2024 17:30 CET na email tomas.urbanec@upol.cz s předmětem: JJ2-3.
- Zasílejte pouze zdrojové kódy.
- Pokud chcete zdrojové kódy poslat zkomprimované, použijte formát zip.
- Implementujte paralelní mergesort, kde počet použitých vláken bude dodán uživatelem. To, jakou techniku vláknování zvolíte, záleží na vás.
- Implementujte jednoduchý server, který mergesort z bodu 1 zpřístupní klientům a který bude schopný obsloužit více klientů najednou - protokol komunikace s klienty je popsán v dalším bodě.
- Implementujte klienta, který se serverem z bodu 2 bude komunikovat následujícím způsobem:
- Klient po připojení k serveru zadá, jak velké pole má být tříděno a počet vláken, které algoritmus dostane k dispozici. Tedy odešle zprávu ve
tvaru
x y
, kdex
ay
jsou přirozená čísla určující velikost pole a počet vláken. - Server po obdržení požadavku
x y
vytvoří náhodné poleint[] arr
velikostix
. - Server
arr
setřídí paralelním mergesortem z bodu 1 sy
vlákny a změří čas tříděnít
v milisekundách. - Server odpoví zprávou
t ms
. - Server čeká na další požadavek.
- Pro ukončení spojení může klient použít požadavek
quit
. - Pro zastavení serveru může klient použít požadavek
stopserver
. - Na libovolný jiný požadavek server reaguje zprávou
undefined
.
- Klient po připojení k serveru zadá, jak velké pole má být tříděno a počet vláken, které algoritmus dostane k dispozici. Tedy odešle zprávu ve
tvaru
Poznámky
- Při testování nebudou používány znaky nového řádku (
\r
a\n
) mimo konec zprávy.