Část 1 – Příklad – GUI aplikace Simulátor/Plátno
Část 2 – Spuštění externího programu v Javě
Vícevláknové aplikace – modely a příklady Jan Faigl
GUI s plátnem Struktura aplikace Struktura simulátoru Struktura grafického rozhraní Praktické ukázky
Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze
Spuštění jiného programu z procesu
Přednáška 6 A0B36PR2 – Programování 2
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
1 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
2 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
3 / 79
GUI s plátnem
Část 3 – Sokety v Javě
Část 4 – Modely vícevláknových aplikací
Základní informace Stručný úvod do síťování
Část I
Síťová API Soket Třídy UDP a TCP soketů Ošetření výjimečných stavů
Modely více-vláknových aplikací
Část 1 – Příklad – GUI aplikace Simulator/Plátno
Prostředky ladění
Příklad - Klient / Server Popis činnosti Komunikační protokol Implementace
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
4 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
5 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
GUI s plátnem
GUI s plátnem
GUI s plátnem
Zadání
Základní struktura aplikace
Simulator – World – SimObject
Pro jednoduchost identické jako rozměry okna/plátna
Iterable
SimObject – jednotné rozhraní simulačního objektu
Simulace běží v samostatném vlákně s periodou PERIOD Simulace probíhá v diskrétních časových okamžicích voláním metody doStep simulačních objektů Má metodu pro zastavení vlákna shutdown
Vizualizaci herního světa se pokusíme oddělit od vlastního simulátoru
Aktuální pozice objektu – public Coords getPosition(); Provedení jednoho simulačního kroku – objekt má definované chování public void doStep();
Grafické rozhraní a vizualizace – obsahuje
Každému objektu simulátoru přiřadíme grafický tvar, který se bude umět zobrazit na plátno
Simulace probíhá ve smyčce:
Základní kontrolní tlačítka pro ovládání simulace (start/stop) Plátno pro vykreslení dílčích objektů Standardní vykreslovací Swing vlákno Samostatné vlákno pro překreslování stavu simulátoru
Simulátor chceme ovládat tlačítky „Start/Stop” Svět simulátoru vizualizujeme na plátně
while(!quit) { for(SimObject obj : objects) { obj.doStep(); } Thread.sleep(PERIOD); }
SwingWorker s přeposíláním zpráv hlavnímu Swing vláknu
Vizualizace plátna bude probíhat „nezávisle” na běhu simulátoru
Grafickou reprezentaci vykreslovaných objektů
Interaktivní hra vs Simulace
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
World – definuje rozměry světa
V zásadě se chová jako kolekce simulačních objektů
Ve světě mohou být různé objekty, které se mohou nezávisle pohybovat Simulátor je „nezávislý” na vizualizaci Simulátor běží v diskrétních krocích
Jan Faigl, 2016
Simulator – kolekce simulačních objektů
Simulátor – obsahuje svět a objekty
Naším cílem je vytvořit simulátor „herního” světa
Vlastní vykreslení grafickými primitivy.
8 / 79
Jan Faigl, 2016
6 / 79
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
9 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
10 / 79
GUI s plátnem
GUI s plátnem
GUI s plátnem
Struktura grafického rozhraní
Struktura plátna MyCanvas a vizualizace
Příklad definice tvaru – ShapeMonster, ShapeNPC
MyCanvas – reprezentuje kolekci vykreslitelných objektů – instance Drawable Každý objekt se umí vykreslit do grafického kontextu
Hlavní okno aplikace obsahuje kontrolní tlačítka Tlačítko start spouští simulaci Tlačítko stop zastavuje běžící simulaci
public void redraw() { Graphics2D gd = getGraphics(); for (Drawable obj : objects) { obj.draw(gd); } }
Vizualizace simulace probíhá ve vlastním plátně MyCanvas Simulační objekty mají svůj grafický tvar Shape Překreslení plátna probíhá periodicky
SwingWorker()
while(sim.isRunning()) { if (sim.isChanged()) { MyCanvas canvas = getSimCanvas(); canvas.redraw(); Thread.sleep(CANVAS_REFRESH_PERIOD); } } A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
public class ShapeMonster extends Shape { public ShapeMonster(SimObject object) { super(object); } @Override public void draw(Graphics2D g2d) { Coords pt = object.getPosition(); g2d.setColor(Color.RED); g2d.fillOval(pt.getX(), pt.getY(), 15, 15); } }
ShapeNPC public class ShapeNPC extends Shape { public ShapeNPC(SimObject object) { super(object); } @Override public void draw(Graphics2D g2d) { Coords pt = object.getPosition(); g2d.setColor(Color.GREEN); g2d.fillRect(pt.getX(), pt.getY(), 15, 15); } }
Vlastní tvar objektu je definován ve třídě Shape
Základní koncept překreslení – neodpovídá kódu Jan Faigl, 2016
ShapeMonster
11 / 79
abstract public class Shape implements Drawable { protected SimObject object; public Shape(SimObject object) { this.object = object; } Jan Faigl, 2016 } A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
12 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
GUI s plátnem
GUI s plátnem
GUI s plátnem
Vytvoření simulačních objektů a jejich tvarů
Příklad – CanvasDemo
Simulace vs grafická hra V simulaci se zpravidla snažíme důsledně oddělit simulované objekty od vizualizace
private Simulator sim; private MyCanvas canvas; public SimulatorGUI(Simulator sim, MyCanvas canvas) { this.sim = sim; this.canvas = canvas; createObjects(); }
Překreslování prostřednictvím SwingWorker vs přímé překreslování ve vlastním vlákně
public void createObjects() { World world = sim.getWorld();
Časování a zajištění periody
1. Na úrovni simulačních objektů a jejich vizuální reprezentace 2. Na úrovni simulačního času a rychlosti překreslování
Přesnost simulace má přednost před rychlou a včasnou vizualizací (v reálném čase)
Hry jsou zpravidla silně svázány s grafickou vizualizací
DoubleBuffer – přepínání vykresleného obrazu
Krok herního světa zpravidla znamená překreslení Kreslící vlákno tak udává také simulační krok Klíčovým aspektem je zachování plynulosti vizualizace a interakce
Plynulé překreslování bez pohybu myši Toolkit.getDefaultToolkit().sync();
SimObject monster = new SimObjectMonster(world, 1, 1); sim.addObject(monster); canvas.addObject(new ShapeMonster(monster));
}
13 / 79
V případě pomalejšího překreslování je rychlost herního světa adekvátně zpomalena.
lec06/CanvasDemo
SimObject npc = new SimObjectNPC(world, 400, 200); sim.addObject(npc); canvas.addObject(new ShapeNPC(npc));
Interaktivní hry zpravidla využívají individuálního kreslení objektů do plátna (případně 3D kontextu) Používají vlastní sadu komponent (widgets), zpravidla vizuálně efektní, princip je však stejný jako například ve Swing. Chceme-li maximalizovat využití zdrojů a zajistit vysokou interaktivitu zpravidla musíme mít plně pod kontrolou běh aplikace.
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
14 / 79
Spuštění jiného programu z procesu
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
15 / 79
Spuštění jiného programu z procesu
Jan Faigl, 2016 Základní informace
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady Síťová API
16 / 79
Příklad - Klient / Server
Příklad - spuštění jiného programu z procesu Příklad - spuštění programu tdijkstra z Javy 1 2
Část II
3 4 5 6
Část 2 – Spuštění externího programu v Javě
7 8 9 10 11 12 13 14 15 16 17 18
private boolean callDijkstra() { boolean ret = false; try { String cmd = "./tdijkstra -h -n " + size + " -s " + seed; Process child = Runtime.getRuntime().exec(cmd); child.waitFor(); if (child.exitValue() == 0) { BufferedReader out = new BufferedReader(new InputStreamReader(child.getInputStream())); hash = Integer.parseInt(out.readLine()); ret = true; } else { System.out.println("Error in dijsktra"); } } catch (Exception e) { System.out.println("Error: Exception : " + e.getMessage()); } return ret; }
Část III Část 3 – Sokety v Javě
Co se stane při nedostatečné vyrovnávací paměti pro stdout. lec06/ExecuteProcess Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
17 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
19 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
20 / 79
Základní informace
Síťová API
Příklad - Klient / Server
Co je síťování?
Základní informace
Síťová API
Příklad - Klient / Server
Zdroje
Základní informace
Síťová API
Příklad - Klient / Server
Komunikace Jiří Peterka, http://www.earchiv.cz/i_prednasky.php3 RFC - Request for Comments, série poznámek o Internetu.
Komunikace slouží k přenosu informace.
Martin Majer, http://www.root.cz/clanky/sitovani-v-jave-uvod/
Mechanismus výměny zpráv musí mít definovaná pravidla. Typicky lze definovat:
Přenos informace se děje výměnou zpráv.
zahájení komunikace, předání zprávy, reakce na zprávu, ukončení komunikace.
W. Richard Stevens, UNIX Network Programming. Prentice Hall. W. Richard Stevens and Stephen A. Rago, Advanced Programming in the UNIX Environment. Addison Wesley. Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Síťová API
22 / 79
Příklad - Klient / Server
Protokol
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Síťová API
23 / 79
Příklad - Klient / Server
Přenos bitů/bytů
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Síťová API
24 / 79
Příklad - Klient / Server
Zapouzdřování datových jednotek
Z uživatelského hlediska jde o přenos obsahu sdělení. aplikační vrstva
print("Hallo");
Způsob komunikace definuje komunikační protokol. Protokol definuje:
aplikační zpráva
Hallo!
transportní vrstva
formát zpráv, pořadí výměny zpráv, syntaxi zpráv, sémantiku zpráv, chování při přijmu a vyslání zprávy.
síťová vrstva linková vrstva
segment
hlavička
hlavička
datová oblast datagramu
segment
datagram
datová oblast rámce
Přenos však vyžaduje další informace související s přenosovou cestou. „Výsledná velikost přenášených dat je vyšší.” Příklad telnet připojení k webovému serveru. Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Síťová API
25 / 79
Příklad - Klient / Server
Modely komunikace
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Síťová API
26 / 79
Příklad - Klient / Server
Způsoby komunikace
Server - reprezentuje služby.
klient/server - klient žádá o službu server. Webový server, poštovní server, Instant Messaging (IM), vzdálená sezení. peer-to-peer (P2P) - každý účastník vystupuje jako klient i jako server. Služby sdílení souborů, bittorrent, . . ..
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
28 / 79
Síťová API
proudový přenos, blokový přenos.
2. Vlastní výměna sdělení.
Podle kvality přenosu a garance kvality přenosu: spolehlivý,
s garantovanou kvalitou,
nespolehlivý,
bez řízení kvality.
Jan Faigl, 2016
27 / 79
Příklad - Klient / Server
1. Obě strany nejdříve navazují spojení.
Podle způsobu přenosu data:
Modely komunikace jsou:
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Spojovaná komunikace (Connection oriented). Skládá se ze tří kroků:
spojovaná komunikace, nespojovaná komunikace.
Klient - reprezentuje poptávku po službě.
Jan Faigl, 2016
Spojovaná komunikace
Kritéria dělení komunikace. Podle způsobu navazování spojení:
Typická síťová aplikace se skládá ze dvou částí:
Jan Faigl, 2016
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Obě strany potvrdí zájem o komunikaci případně upřesní parametry vzájemné komunikace.
3. Ukončení spojení.
29 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
30 / 79
Základní informace
Síťová API
Příklad - Klient / Server
Vlastnosti spojované komunikace
Základní informace
Síťová API
Příklad - Klient / Server
Nespojovaná komunikace
Nedochází k ověřování existence druhé strany.
Přechody mezi stavy musí být koordinované.
„Obě strany musí být v kompatibilním stavu, aby se domluvily.”
Musí být ošetřovány nestandardní situace. Například rozpad spojení.
Komunikace probíhá zasíláním samostatných zpráv (datagramů). Adresování zprávy
Přijímací strana obdrží zprávy ve stejném pořadí v jakém je poslala vysílací strana.
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Síťová API
31 / 79
Příklad - Klient / Server
Komunikace je bezstavová. Zprávy jsou přenášeny v samostatném bloku dat (datagramu), které jsou samostatně přenášeny.
Soket - aplikace a OS
operační systém
Jan Faigl, 2016
proces
proces
soket
soket
transportní vrstva
32 / 79
Příklad - Klient / Server
Síťová API
Soket je softwarová komponenta.
Soket API konvertuje obecnou aplikační vrstvu na specifický protokol transportní vrstvy. Soket API definuje operace nad soketem (primitiva). Soket reprezentuje koncový bod komunikace.
Jan Faigl, 2016
connect(InetAddress address, int port) bind(SocketAddress addr) disconnect() close() receive(DatagramPacket p) send(DatagramPacket p) Cílová adresa je součástí datagramu.
String host, int port, java.net.InetAddress. java.net.SocketAddress.
35 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Síťová API
36 / 79
Příklad - Klient / Server
Ošetření výjimečných stavů
Server soket primitiva
Jan Faigl, 2016
klient
37 / 79
Příklad - Klient / Server
server kolik je hodin
ConnectException
connect(SocketAddress endpoint) connect(SocketAddress endpoint, int timeout) bind(SocketAddress bindpoint) Jaké rozhraní a jaký port chceme použít pro spojení ( null). close() Zápis a čtení je realizováno proudy.
Síťová API
Časový server
BindException
Soket (klientský) primitiva
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Aplikace Klient / Server
Mechanismem výjimek java.net.SocketException, resp. java.io.IOException.
bind(SocketAddress endpoint) Socket accept() close()
34 / 79
Příklad - Klient / Server
Primitiva
Adresa
Příklad - Klient / Server
Síťová API
DatagramPacket(byte[] buf, int length) DatagramPacket(byte[] buf, int length, InetAddress address, int port) byte[] getData()
http://docs.oracle.com/javase/tutorial/networking/sockets/index.html
transportní vrstva
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Datová jednotka java.net.DatagramPacket.
java.net.ServerSocket java.net.Socket
NoRouteToHostException ProtocolException SocketException SocketTimeoutException 4. 12. 11:00:34 2008
UnknownHostException
OutputStream getOutputStream() InputStream getInputStream()
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
1981 BSD4.1 Unix.
UDP soket
Lesson: All About Sockets
TCP soket
Jan Faigl, 2016
Síťová API
UDP soket java.net.DatagramSocket TCP sokety:
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Sokety v Javě
Síťové rozhraní patří mezi sdílené prostředky, proto přístup k němu řídí OS. uživatelský proces
Jan Faigl, 2016
Soket je objekt, který propojuje aplikaci s nějakým „síťovým” protokolem.
Není omezen pouze na TCP/IP.
Není zaručené pořadí zpráv.
Jan Faigl, 2016
Příklad - Klient / Server
Soket je obecný objekt komunikace mezi dvěma procesy.
Není nutné komunikaci ukončovat. Vlastnosti:
Při přenosu zpráv je zachováno pořadí vysílaných zpráv.
Síťová API
Soket
Komunikující strany nenavazují spojení. Součástí komunikace je přechod stavů účastníků.
Základní informace
38 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
39 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
41 / 79
Základní informace
Síťová API
Příklad - Klient / Server
Popis činnosti
Základní informace
Síťová API
Příklad - Klient / Server
Definice protokolu
Základní informace
Síťová API
Příklad - Klient / Server
Definice protokolu - příkazy Příkaz se skládá ze jména příkazu a znaku konce řádky ’\n’.
1. Po navázání spojení server posílá výzvu ’Username:’.
Jednoduchý telnet server s dvěma příkazy.
Server odpovídá textovou zprávou závislou na příkazu, ukončenou ’\n’. Příkazy:
2. Klient odpovídá posláním uživatelského jména zakončeného znakem ’\n’.
time pošle aktuální čas serveru. bye ukončení sezení.
Textově orientované spojení.
3. Server posílá výzvu ’Password:’.
Po navázání spojení (TCP) musí klient poslat uživatelské jméno a heslo.
5. Server odpovídá zprávou ’Welcome\n’.
Žádost o zaslání aktuálního času. 1. Klient: ’time\n’. 2. Server: posílá aktuální čas ve formátu ’time is: dow mon dd hh:mm:ss zzz yyyy\’.
4. Klient odpovídá posláním hesla zakončeného znakem ’\n’.
Ukončení spojení.
6. Klient může posílat serveru příkazy v libovolném pořadí.
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Základní informace
Síťová API
42 / 79
Příklad - Klient / Server
Implementace
Jan Faigl, 2016 Základní informace
Implementaci rozdělíme na třídy: ParseMessage - realizuje čtení a zápis textové zprávy z/do proudu.
2 3 4 5
Obsah textové zprávy může začínat a nebo končit zadanou sekvencí znaků.
6 7
Server - otevírá serverový soket na zadaném portu, po přijetí klienta vytváří ovladač klientského spojení.
8 9 10
ClienHandler - realizuje obsluhu klientského spojení v samostatném vlákně.
11
Client - testovací klient, který se přípojí k serveru na zadné adrese a portu.
14
Klient pošle uživatelské jméno, heslo a žádost o aktuální čas, který vypíše na obrazovku (pouze časový údaj) a skončí. Vše proběhne bez interakce uživatele.
12 13 15 16 17 18 19 20 21
Základní informace
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady Síťová API
45 / 79
Příklad - Klient / Server
ClientHandler 2/3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
43 / 79
Příklad - Klient / Server
Jan Faigl, 2016 Základní informace
1 2 3 4 5 6 7 8 9 10 11 12
public void run() { String cID = "client["+id+"] "; try { log(cID + "Accepted"); write("Login:"); log(cID + "Username:" + read("", "\n")); write("Password:"); log(cID + "Password:" + read("", "\n")); write("Welcome\n");
13 14 15 16 17 18 19 20 21
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
48 / 79
Základní informace
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady Síťová API
1 2 3 4 5 6 7
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady Síťová API
44 / 79
Příklad - Klient / Server
class ClientHandler extends ParseMessage implements Runnable { static final int UNKNOWN = -1; static final int TIME = 0; static final int BYE = 1; static final int NUMBER = 2; static final String[] STRCMD = {"time", "bye"}; static int parseCmd(String str) { int ret = UNKNOWN; for (int i = 0; i < NUMBER; i++) { if (str.compareTo(STRCMD[i]) == 0) { ret = i; break; } } return ret; }
8 9 10 11 12 13 14 15 16 17 18
Socket sock; //klientský soket int id; //číslo klientu
19 20
46 / 79
Příklad - Klient / Server
Jan Faigl, 2016 Základní informace
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady Síťová API
47 / 79
Příklad - Klient / Server
Server
... //run pokračování boolean quit = false; while (!quit) { switch(parseCmd(read("", "\n"))) { case TIME: write("time is:"+ new Date().toString() + "\n"); break; case BYE: log(cID + "Client sends bye"); quit = true; break; default: log(cID + "Unknown message, disconnect"); quit = true; break; } } sock.shutdownOutput(); sock.close(); } catch (Exception e) { log(cID + "Exception:" + e.getMessage()); e.printStackTrace(); } } }
Jan Faigl, 2016
Jan Faigl, 2016
ClientHandler 1/3
class ParseMessage { void write(String msg) throws IOException { out.write(msg.getBytes()); } String read(String startStr, String endStr) throws IOException { byte[] start = startStr.getBytes(); byte[] end = endStr.getBytes(); int sI = 0; int eI = 0; byte r;int count = 0; while((sI < start.length) && ((r = (byte)in.read()) != -1)) { sI = (r == start[sI]) ? sI+1 : 0; } while ((eI < end.length) && (count < BUFFSIZE) && ((r = (byte)in.read()) != -1)) { buffer[count++] = r; eI = (r == end[eI]) ? eI+1 : 0; } return new String(buffer, 0, count > end.length ? count-end.length : 0); } }
ClientHandler 3/3
ClientHandler(Socket iSocket, int iID) throws IOException { sock = iSocket; id = iID; out = sock.getOutputStream(); in = sock.getInputStream(); } public void start() { new Thread(this).start(); } void log(String str) {System.out.println(str)};
Jan Faigl, 2016
Síťová API
ParseMessage 1
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
1. Klient: ’bye\n’. 2. Server: posílá konec proudu a zavírá soket.
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
1 2 3 4 5 6 7 8 9 10 11 12
public class Server { public Server(int port) throws IOException { int i = 0; ServerSocket servsock = new ServerSocket(port); while (true) { try { new ClientHandler(servsock.accept(), i++); } catch (IOException e) { System.out.println("IO error in new client"); } } } // Server()
13 14 15 16 17 18 19 20 21
49 / 79
}
public static void main(String[] args) { try { new Server(args.length > 0 ? Integer.parseInt(args[0]) : 9000); } catch (Exception e) { e.printStackTrace(); } }
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
50 / 79
Základní informace
Síťová API
Příklad - Klient / Server
Client 1/2
Základní informace
2 3 4 5 6 7 8 9 10 11 12 13 14 15
Příklad - Klient / Server
Client 2/2 1
1
Síťová API
2
public class Client extends ParseMessage { Socket sock; public static void main(String[] args) { Client c = new Client( args.length > 0 ? args[0] : "localhost", args.length > 1 ? Integer.parseInt(args[1]) : 9000 ); }
3 4 5 6 7 8 9
Client(String host, int port) { try { sock = new Socket(); sock.connect(new InetSocketAddress(host, port)); out = sock.getOutputStream(); in = sock.getInputStream();
10 11 12 13 14 15 16 17
}}
Základní informace
Síťová API
Ukázka činnosti
Příklad – Telnet
//Client konstruktor pokračování write("user\n"); read("", "Password:"); System.out.println("Password prompt readed"); write("heslo\n"); read("", "Welcome\n"); write("time\n"); out.flush(); System.out.println("Time on server is " + read("time is:", "\n")); write("bye\n"); sock.shutdownOutput(); sock.close(); System.out.println("Communication END"); } catch (Exception e) { System.out.println("Exception:" + e.getMessage()); }
Příklad – Server
oredre$ java Telnet Login:telnet Password:tel Welcome time time is:Tue Nov 28 09:56:49 CET 2006 time time is:Tue Nov 28 09:56:50 CET 2006 bye
1 2 3 4 5 6 7 8 9
Příklad - Klient / Server
1 2 3 4 5 6 7 8 9
oredre$ java Server client[0] Accepted client[0] Username:telnet client[1] Accepted client[1] Username:user client[1] Password:heslo client[1] Client sends bye client[0] Password:tel client[0] Client sends bye
Příklad – Klient 1 2 3 4
oredre$ java Client Password prompt readed Time on server is Tue Nov 28 09:56:40 CET 2006 Communication END lec06/socket Demonstrační příklad se zdrojovými soubry z roku 2006, kterému odpovídá kódovací styl
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
51 / 79
Prostředky ladění
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
52 / 79
Prostředky ladění
Kdy použít vlákna?
Je složena z nezávislých úloh.
Část 4 – Modely vícevláknových aplikací
Obsahuje úlohy s nižší nebo vyšší prioritou než zbytek aplikace.
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
54 / 79
Prostředky ladění
Modely vícevláknových aplikací
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
56 / 79
Prostředky ladění
Boss/Worker model
Vstup
1. příchod požadavku, 2. vytvoření vlákna pro řešení příslušného úkolu, 3. návrat na čekání požadavku.
Zdroj
Boss
úloha
Výstup řešení úkolu je řízen:
Předpokládá dlouhý vstupních proud dat.
úloha
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
58 / 79
Jan Faigl, 2016
57 / 79
Prostředky ladění
Hlavní vlákno je zodpovědné za vyřizování požadavků. Pracuje v cyklu:
úloha
Pipeline - zpracování dat sekvencí operací.
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
Zdroje
Workers
Modely řeší způsob vytváření a rozdělování práce mezi vlákny. Peer - vlákna běží paralelně bez specifického vedoucího.
Jan Faigl, 2016
Boss/Worker rozdělení činnosti
Program
Boss/Worker - hlavní vlákno řídí rozdělení úlohy jiným vláknům.
Servery - obsluhují více klientů najednou. Obsluha typicky znamená přístup k několika sdíleným zdrojům a hodně vstupně výstupních operací (I/O).
Aplikace reálného času - lze využít specifických rozvrhovačů. Vícevláknová aplikace je výkonnější než složité asynchronní programování, neboť vlákno čeká na příslušnou událost namísto explicitního přerušování vykonávání kódu a přepínání kontextu.
Musí reagovat na asynchronní události.
Modely aplikací
53 / 79
Prostředky ladění
Výpočetní aplikace - na víceprocesorovém systému lze výpočet urychlit rozdělením úlohy na více procesorů.
Může být blokována po dlouho dobu. Obsahuje výpočetně náročnou část.
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
Typické aplikace
Vlákna je výhodné použít, pokud aplikace splňuje některé následující kritérium:
Část IV
Jan Faigl, 2016
Příslušným vláknem řešícím úkol. Hlavním vláknem, předání využívá synchronizační mechanismy.
Zdroj
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
59 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
60 / 79
Modely aplikací
Prostředky ladění
Boss/Worker příklad
Modely aplikací
Prostředky ladění
Thread Pool
Modely aplikací
Prostředky ladění
Thread Pool - vlastnosti
Příklad Boss/Worker model 1 2 3 4 5 6 7 8 9 10 11
//Boss main() { while(1) { switch(getRequest()) { case taskX : create_thread(taskX); case taskY : create_thread(taskY); . . } } }
1 2 3
4 5 6 7 8
9 10
Hlavní vlákno vytváří vlákna dynamicky podle příchozích požadavků.
//Worker taskX() { řešení úlohy, synchronizace v případě sdílených zdrojů; done; }
Režii vytváření lze snížit, vytvořením vláken dopředu (Thread Pool).
Počet vytvořených vláken.
Vytvořená vlákna čekají na přiřazení úkolu.
Maximální počet požadavků ve frontě požadavků. Definice chování v případě plné fronty požadavků a žádného volného vlákna.
Thread pool
Workers
taskY() { řešení úlohy, synchronizace v případě sdílených zdrojů; done; }
Například blokování příchozích požadavků.
fronta požadavků
C style
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
61 / 79
Prostředky ladění
Peer model
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
62 / 79
Prostředky ladění
Peer model - vlastnosti
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
63 / 79
Prostředky ladění
Peer model - příklad Příklad Peer model
Program
Zdroje
//Boss main() { create_thread(task1); create_thread(task2); . . start all threads; wait for all threads; }
1 2
Workers
3
Neobsahuje hlavní vlákno. První vlákno po vytvoření ostatních vláken:
úloha
Vstup
Zdroj
4 5 6 7 8
se stává jedním z ostatních vláken (rovnocenným), pozastavuje svou činnost do doby než ostatní vlákna končí.
úloha
9
Každé vlákno je zodpovědné za svůj vstup a výstup.
1 2 3 4
5 6 7 8 9 10
Zdroj
úloha
11 12
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
64 / 79
Prostředky ladění
Zpracování proudu dat - Pipeline
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
65 / 79
Prostředky ladění
Pipeline
Jan Faigl, 2016
část 1
66 / 79
Prostředky ladění
Příklad Pipeline model část 2
část 3
1
výstup
2 3 4 5 6
Sekvence operací (částí zpracování), každá vstupní jednotka musí projít všemi částmi zpracování.
7 8 9 10
V každé části jsou v daném čase, zpracovávány různé jednotky vstupu (nezávislost jednotek). Zdroj
11
Zdroj
12 13 14
Zdroj
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Pipeline model - příklad
Dlouhý vstupní proud dat.
Zdroj
task2() { čekáná na spuštení; řešení úlohy, synchronizace v případě sdílených zdrojů; done; }
Modely aplikací
Program vstup
//Worker task1() { čekáná na spuštení; řešení úlohy, synchronizace v případě sdílených zdrojů; done; }
Zdroj
main() { create_thread(stage1); create_thread(stage2); . . wait for all pipeline; } stage1() { while(input) { get next program input; process input; pass result to next stage; } }
Zdroj
1 2 3 4 5 6 7 8 9 10 11 12 13 14
stage2() { while(input) { get next input thread; process input; pass result to stage; } } stageN() { while(input) { get next input thread; process input; pass result to } }
from next
from output; C style
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
67 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
68 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
69 / 79
Modely aplikací
Prostředky ladění
Producent a konzument
Modely aplikací
Prostředky ladění
Vícevláknové aplikace a ladění
Při paralelním běhu programu mohou být funkce volány vícenásobně. Funkce jsou : reentrantní - V jediném okamžiku může být stejná funkce vykonávána současně
Producent - vlákno, které předává data jinému vláknu. Konzument - vlákno, které přijímá data od jiného vlákna. Přístup do vyrovnávací pamětí musí být synchronizovaný (exkluzivní přístup). producent
Prostředky ladění
Funkce a paralelismus
Předávání dat mezi vlákny je realizováno vyrovnávací pamětí bufferem.
vyrovnávací paměť
Modely aplikací
Např. vnořená obsluha přerušení
thread-safe - Funkci je možné současně volat z více vláken Dosažení těchto vlastností: Reentrantní funkce nezapisují do statických dat, nepracují s globálními daty.
konzument
Hlavní problémy vícevláknových aplikací souvisí se synchronizací: Uváznutí – deadlock. Souběh (race conditions) - přístup více vláken ke sdíleným proměnným a alespoň jedno vlákno nevyužívá synchronizačních mechanismů. Vlákno čte hodnotu zatímco jiné vlákno zapisuje. Zápis a čtení nejsou atomické a data mohou být neplatná.
Thread-safe funkce využívají synchronizačních primitiv při přístupu ke globálním datům.
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
70 / 79
Prostředky ladění
Prostředky ladění
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
72 / 79
Prostředky ladění
Podpora ladění
Vlákna jsou asynchronní.
Výpis stavu synchronizačních primitiv.
Nespoléhat na to, že na jednoprocesorovém systému je vykonávání kódu synchronní.
Přístup k proměnným vláken.
Toho lze dosáhnou kázní a obezřetným přístupem ke sdíleným proměnným. Nicméně je vhodné využívat ladící prostředí s minimální množinou vlastností.
Při psaní vícevláknové aplikace předpokládejte, že vlákno může být kdykoliv přerušeno nebo spuštěno.
Pozastavení běhu konkrétního vlákna. Záznam průběhu běhu celého programu (kompletní obsah paměti a vstupů/výstup) a procházení záznamu
Části kódu, u kterých je nutné zajistit pořadí vykonávání jednotlivými vlákny vyžadují synchronizaci.
Nikdy nespoléhejte na to, že vlákno po vytvoření počká, může být spuštěno velmi brzy.
Logování: Problém uváznutí souvisí s pořadím událostí, logováním přístupu k zámkům lze odhalit případné špatné pořadí synchronizačních operací.
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
74 / 79
Prostředky ladění
Jan Faigl, 2016
73 / 79
Prostředky ladění
Problémy souběhu jsou typicky způsobeny nedostatkem synchronizace.
Výpis běžících vláken.
nepotřebovat ladit.
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Modely aplikací
Poznámky - „problémy souběhu”
Debugger: Nejlepším prostředkem ladění vícevláknových aplikací je
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
Pokud nespecifikujete pořadí vykonávání vláken, žádné takové neexistuje. „ Vlákna běží v tom nejhorším možném pořadí. Bill Gallmeister” 75 / 79
Diskutovaná témata
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
76 / 79
Diskutovaná témata
Poznámky - „problém uváznutí”
Diskutovaná témata
Problémy uváznutí souvisí s mechanismy synchronizace. Uváznutí (deadlock) se na rozdíl o souběhu mnohem lépe ladí. Častým problém je tzv. mutex deadlock způsobený pořadím získávání mutexů (zámku/monitorů).
Modely vícevláknových aplikací Paralelní programování a ladění
Shrnutí přednášky
Mutex deadlock nemůže nastat, pokud má každé vlákno uzamčený pouze jeden mutex (chce uzamknout).
Problém uváznutí a problém souběhu
Spuštění externího program v rámci Java programu Sokety v Javě Příklady vícevláknových aplikací
Není dobré volat funkce s uzamčeným mutexem, obzvláště zamykáli volaná funkce jiný mutex.
GUI plátno – simulátor a kreslení do canvasu
Je dobré zamykat mutex na co možná nejkratší dobu. V Javě odpovídá zámek krické sekci monitoru synchronized(mtx){}
Příště: Test - 7.4.2016!
http://www.javaworld.com/article/2076774/java-concurrency/ programming-java-threads-in-the-real-world--part-1.html
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
77 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
78 / 79
Jan Faigl, 2016
A0B36PR2 – Přednáška 6: Vícevláknové aplikace – příklady
79 / 79