VIII. Seminář Java VIII p.1/36

Podobné dokumenty
Vlákna. První jednoduchý program s vlákny:

Vlákna. První jednoduchý program s vlákny:

Java - výjimky. private void vstup() throws IOException {... }

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Aplikace s grafickým uživatelským rozhraním

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

30. Vlákna, jejich atributy, metody, organizace a stavy. Možnosti synchronizace. (A7B36PVJ)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

JAVA V Vlákna Java, zimní semestr

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

1. Téma 12 - Textové soubory a výjimky

Programování v Javě I. Leden 2008

Algoritmizace a programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Procházka na provázku

Programování v Javě I. Únor 2009

JAVA. Krátke poznámky:

Vláknové programování část V

Programování v jazyku Java vlákna a procesy

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Abstraktní datové typy: zásobník

Seminář Java II p.1/43

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

JAVA V jar Java, zimní semestr

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Java a XML. 10/26/09 1/7 Java a XML

Java GUI události. Událostmi řízené programování. Zpracování = obsluha událostí

Vícevláknové aplikace

Java - Kresba. 2/28/11 1/8 Java - kresba

Projekty pro výuku programování v jazyce Java

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

1. Programování proti rozhraní

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Multithreading vícevláknovost

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Vytváření a použití knihoven tříd

Principy objektově orientovaného programování

Úvod do programovacích jazyků (Java)

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

UJO Framework. revoluční architektura beans. verze

Z. Kotala, P. Toman: Java ( Obsah )

ZOS 9. cvičení, ukázky kódu. Pavel Bžoch

Java aplety. Předávání parametrů z HTML

8 Třídy, objekty, metody, předávání argumentů metod

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Soubor jako posloupnost bytů

Datové struktury. alg12 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programovací jazyky s podporou vláken Java

GUI v Javě a událostmi řízené programování

Grafické uživatelské rozhraní v Javě. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Procesy a vlákna - synchronizace

Teoretické minimum z PJV

Generické programování

5 Rekurze a zásobník. Rekurzivní volání metody

17. Projekt Trojúhelníky

IRAE 07/08 Přednáška č. 7. Začátek (head)

O autorovi O odborném korektorovi Úvod 17 Vývoj jazyka Java Java SE 8 Struktura této knihy Předchozí zkušenosti s programováním nejsou potřebné

Obsah přednášky. GUI v Javě a událostmi řízené programování. Základní prvky grafického rozhraní. Základní komponenty.

GUI - úvod. V této kapitole si ukážeme návod, jak vytvořit jednoduchou grafickou aplikaci a umístit do ní některé další grafické prvky.

KTE / ZPE Informační technologie

GUI v Javě a událostmi řízené programování

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Java Enum Java, zimní semestr ,2017 1

GUI v Javě a událostmi řízené programování

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Pokročilé programování na platformě Java. Úvod

Úvod do programování - Java. Cvičení č.4

RMI Remote Method Invocation

Grafické uživatelské rozhraní v Javě. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Java Výjimky Java, zimní semestr

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Dědičnost (inheritance)

Regulární výrazy. Vzory

Typický prvek kolekce pro české řazení

8. přednáška: Soubory a proudy

Paměť počítače. alg2 1

Algoritmizace a programování

Programovací jazyk Java

Textové soubory. alg9 1

7. Dynamické datové struktury

Obsah přednášky. GUI v Javě a událostmi řízené programování. Základní prvky grafického rozhraní. Základní komponenty.

Konstruktory a destruktory

GUI v Javě (připomínka) Návrhář GUI Příklad aplikace MVC Model-View-Controller Události Vnitřní třídy. MVC Model-View-Controller

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

7. Datové typy v Javě

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

typová konverze typová inference

Abstraktní třída a rozhraní

IMPLEMENTACE INFORMAČNÍHO SYSTÉMU VIDIUM V JAZYCE JAVA

Úvod do programovacích jazyků (Java)

8. GRAFICKÉ UŽIVATELSKÉ ROZHRANÍ

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Transkript:

Seminář Java VIII Seminář Java VIII p1/36

Rekapitulace Grafické uživatelské rozhraní Swing vs AWT Aplety Aplikační rámec, JApplet spouštení v prohlížeči, Appletviewer Událostní model knihovny Swing události posluchači Jednotlivé komponenty knihovny Swing přehled, příklady Rozmístění komponent Správci rozmístění Vizuální programování a komponenty JavaBeans Seminář Java VIII p2/36

Obsah Podprocesy, vlákna Třida Thread, rozhraní Runnable Podprocesy typu Daemon Sdílení prostředků Blokování procesů Priority procesů Skupiny procesů Seminář Java VIII p3/36

Procesy, podprocesy (vlákna) Proces - samostatný spuštěný program s vlastním adresovým prostorem Podproces (vlákno) - samostatná, nezávisle na sobě spuštěná vedlejší úloha Multithreading - technika rozdělení programu na více podprocesů slouží k oddělení části programu, vázané na určité prostředky vytváří podproces nezávislý na hlavním programu Seminář Java VIII p4/36

Vytvoření vlákna vytvořením potomka třídy Thread implementováním rozhraní Runnable Obojí obsaženo v balíku javalang Seminář Java VIII p5/36

Třída Thread nutné překrýt metodu run() kód v této metodě bude spuštěn simultálně s kódem ostatních podprocesů daného programu metoda start() volá incializaci podprocesu a spouští metodu run() metoda destroy() ukončí celé vlákno (násilně), bez uvolnění ostatních zdrojů metoda interrupt() přeruší dané vlákno metoda boolean interrupted() vrácí je-li vlákno přerušeno metoda sleep(long millis) způsobí "uspání" vlákna na určitý počet milisekundvyhazuje InterruptedException metoda yield() dočasně zastaví aktuální vlákno a umožní tak spuštění vláken ostatních Seminář Java VIII p6/36

public void run() { while(true) { Systemoutprintln("Podproces " + cislopodprocesu + "(" + odpocitavani + ")"); if(--odpocitavani == 0) return; Seminář Java VIII p7/36 Příklad 1 - jednoduché vlákno (1) public class SimpleThread extends Thread { private int odpocitavani = 5; private static int pocetpodprocesu = 0; private int cislopodprocesu = ++pocetpodprocesu; public SimpleThread() { Systemoutprintln("Vytvarim " + cislopodprocesu);

Příklad 1 - jednoduché vlákno (2) public static void main(string[] args) { for(int i = 0; i < 5; i++) new SimpleThread()start(); Systemoutprintln("Vsechny podprocesy spusteny"); procesy nemusí být spuštěny v pořadí v jakém jsou vytvořeny toto pořadí nemůžeme ani zjistit všechny vlákna zde mají stejnou prioritu Seminář Java VIII p8/36

Příklad 2 - čítač (1) public class Counter extends JFrame { private VedlejsiUloha vedlejsi = null; private JTextField txtpole = new JTextField(10); private JButton start = new JButton("Start"), prepinac = new JButton("Prepinac"); public Counter() { setdefaultcloseoperation(exit_on_close); initcomponents(); private void initcomponents() { Container cp = getcontentpane(); cpsetlayout(new FlowLayout()); cpadd(txtpole); Seminář Java VIII p9/36

Příklad 2 - čítač (2) startaddactionlistener(new ActionListener() { public void actionperformed(actionevent e) { if (vedlejsi == null) vedlejsi = new VedlejsiUloha(); ); cpadd(start); prepinacaddactionlistener(new ActionListener() { public void actionperformed(actionevent e) { if (vedlejsi!= null) vedlejsizmenitpriznak(); ); cpadd(prepinac); pack(); Seminář Java VIII p10/36

Příklad 2 - čítač (3) public static void main(string[] args) { Counter cnt = new Counter(); cntsetvisible(true); private class VedlejsiUloha extends Thread { private int citac = 0; private boolean priznakspusteni = true; VedlejsiUloha() { start(); void zmenitpriznak() {priznakspusteni =! priznakspusteni; public void run() { while (true) { try { sleep(100); catch(interruptedexception e) { Systemerrprintln("Preruseno"); Seminář Java VIII p11/36

Příklad 2 - čítač (4) if (priznakspusteni) txtpolesettext(integertostring(citac++)); Seminář Java VIII p12/36

Rozhraní Runnable kombinace podprocesu s hlavní třídou získáme spustitelný objekt (ve smyslu vlákna) není spuštěn -> spustit explicitně Seminář Java VIII p13/36

Příklad 3 - čítač s použítím Runnable přesuneme metodu run() do hlavní třídy upravíme posluchače ošetřující akce start a přepínač inicializaci provedeme Thread podproces = new Thread(this); spuštění opět podprocesstart(); Seminář Java VIII p14/36

Podprocesy typu Daemon poskytuje služby na pozadí po celou dobu relace programu není podstatou programu ukončí se až po ukončení všech procesů voláním metody boolean isdaemon() zjistíme, zda je proces typu démon příznak nastavíme metodou setdaemon() Seminář Java VIII p15/36

Příklad 4 - typu Daemon (1) class Daemon extends Thread { private static final int VELIKOST = 10; private Thread[] podprocesy = new Thread[VELIKOST]; public Daemon() { setdaemon(true); start(); public void run() { for(int i = 0; i < podprocesylength; i++) podprocesy[i] = new VyplodDaemona(i); for(int i = 0; i < VELIKOST; i++) Systemoutprintln("t[" + i + "]isdaemon() = " + podprocesy[i]isdaemon()); while(true) yield(); Seminář Java VIII p16/36

Příklad 4 - typu Daemon (2) class VyplodDaemona extends Thread { public VyplodDaemona(int i) { Systemoutprintln("VyplodDaemona " + i + " spusten"); start(); public void run() { while(true) yield(); Seminář Java VIII p17/36

Příklad 4 - typu Daemon (3) public class Daemons { public static void main(string[] args) throws IOException { Thread podproces = new Daemon(); Systemoutprintln("podprocesisDaemon() = " + podprocesisdaemon()); //umoznuje procesum typu daemon ukonceni jimi zapocatych //procesu Systemoutprintln("Stisknete libovolnou klavesu"); Systeminread(); Seminář Java VIII p18/36

Příklad 5 - nesprávný přístup k prostředkům public class Sharing1 extends JApplet { private static int accesscount = 0; private static JTextField acount = new JTextField("0", 7); private JButton start = new JButton("Start"), watcher = new JButton("Watch"); private boolean isapplet = true; private int numcounters = 12; private int numwatchers = 15; private TwoCounter[] s; public static void incrementaccess() { accesscount++; acountsettext(integertostring(accesscount)); Seminář Java VIII p19/36

Příklad 5 - nesprávný přístup k prostředkům class TwoCounter extends Thread { private boolean started = false; private JTextField t1 = new JTextField(5), t2 = new JTextField(5); private JLabel l = new JLabel("count1 == count2"); private int count1 = 0, count2 = 0; // přidá komponenty na panel a panel vloží public TwoCounter() { JPanel p = new JPanel(); padd(t1); padd(t2); padd(l); getcontentpane()add(p); Seminář Java VIII p20/36

Příklad 5 - nesprávný přístup k prostředkům public void start() { if(!started) { started = true; superstart(); public void run() { while (true) { t1settext(integertostring(count1++)); t2settext(integertostring(count2++)); try { sleep(500); catch(interruptedexception e) { Systemerrprintln("Interrupted"); Seminář Java VIII p21/36

Příklad 5 - nesprávný přístup k prostředkům public void synchtest() { incrementaccess(); if(count1!= count2) lsettext("unsynched"); class Watcher extends Thread { public Watcher() { start(); public void run() { while(true) { for(int i = 0; i < slength; i++) s[i]synchtest(); try { sleep(500); catch(interruptedexception e) { Systemerrprintln("Interrupted"); Seminář Java VIII p22/36

Příklad 5 - nesprávný přístup k prostředkům class StartL implements ActionListener { public void actionperformed(actionevent e) { for(int i = 0; i < slength; i++) s[i]start(); class WatcherL implements ActionListener { public void actionperformed(actionevent e) { for(int i = 0; i < numwatchers; i++) new Watcher(); Seminář Java VIII p23/36

Příklad 5 - nesprávný přístup k prostředkům public void init() { if(isapplet) { String counters = getparameter("size"); if(counters!= null) numcounters = IntegerparseInt(counters); String watchers = getparameter("watchers"); if(watchers!= null) numwatchers = IntegerparseInt(watchers); s = new TwoCounter[numCounters]; Container cp = getcontentpane(); Seminář Java VIII p24/36

Příklad 5 - nesprávný přístup k prostředkům cpsetlayout(new FlowLayout()); for(int i = 0; i < slength; i++) s[i] = new TwoCounter(); JPanel p = new JPanel(); startaddactionlistener(new StartL()); padd(start); watcheraddactionlistener(new WatcherL()); padd(watcher); padd(new JLabel("Access Count")); padd(acount); cpadd(p); Seminář Java VIII p25/36

Příklad 5 - nesprávný přístup k prostředkům public static void main(string[] args) { Sharing1 applet = new Sharing1(); // nespouštím jako aplet, argumenty z příkazového řádku appletisapplet = false; appletnumcounters = (argslength == 0? 12 : IntegerparseInt(args[0])); appletnumwatchers = (argslength < 2? 15 : IntegerparseInt(args[1])); Consolerun(applet, 350, appletnumcounters * 50); Seminář Java VIII p26/36

Sdílení prostředků souběžný přístup k prostředkům (pamět, soubory, ) použití modifikátoru synchronized Příklad synchronized void f() {; synchronized void g() {; každý objekt obsahuje jeden zámek (monitor) automaticky se stává součástí objektu Synchronizovat lze objekty metody bloky Seminář Java VIII p27/36

Příklad 6 - oprava souběžného přístupu Příklad 5 lze upravit např přídáním modifikátoru synchronized před metody třídy TwoCounter synchronized run() a synchronized synchtest() přídáním zámku na objekt TwoCounter v metodě run() public void run() { while (true) { synchronized (this) { t1settext(integertostring(count1++)); t2settext(integertostring(count2++)); Seminář Java VIII p28/36

Efektivita synchronizovaného volání při uzamčení určitého objektu se zvýší náklady na režii změnit návrh použít zámek na konkrétní objekt (NIKDY neodbýt souběžný přístup synchronizací všech přístupových metod) Seminář Java VIII p29/36

Blokování procesů Proces může být v jednom ze čtyř stavů nový vytvořen neinicializován -> nemůže být spuštěn spuštěný lze spustit (může, ale nemusí být spuštěný) neužívaný možnost zastavit zavrhovanou (deprecated) metodou stop() krajní případ destroy() blokovaný může být spuštěn, ale je mu bráněno v činnosti nevykonává žádný kód až do svého návratu do stavu spustitelný Seminář Java VIII p30/36

Zablokování procesu Podproces lze zablokovat pěti způsoby 1 vstoupil do režimu spánku (voláním metody sleep()) 2 pozastavení metodou suspend(), opětovné spuštění metodou resume() (obojí zavrhováno) 3 pozastavení metodou wait(), opětovné spuštění metodou notify() nebo notifyall() 4 čekání na dokončení I/O operace datový proud je automaticky zablokován, čeká-li na dokončení I/O operace 5 pokus o volání metody synchronizovaného objektu Seminář Java VIII p31/36

Metody wait() a notify() odemyká uzamčené objekty metoda wait(long millis) - stejný význam jako sleep(long millis) zámek objektu je uvolněn vyhazuje vyjímku IllegalMonitorStateException notify() návrat ze stavu čekání Seminář Java VIII p32/36

Priority Priorita podprocesu - vlastnost sdělující míru důležitosti daného podprocesu plánovací modul postupně spouští podprocesy s nejvýšší prioritou nížší priorita způsobí méně časté spouštění daného podprocesu Čtení a nastavení priorit metoda getpriority() a setpriority() priorita podprocesu se může pohybovat v rozmezí 1-10 implicitní priorita vytvořeného podprocesu 5 Seminář Java VIII p33/36

Skupiny podprocesů podproces vždy patří k nějaké skupině implicitně k systémových podprocesům systémový podproces bude vždy rodičovský ThreadcurrentThread()getThreadGroup() podproces je svázán s určenou skupinou po celou dobu své existence nelze změnit procesy sdružujeme ve skupině podprocesů třídy ThreadGroup umožňuje nám to řídit naráz celé skupiny podprocesů Seminář Java VIII p34/36

Třída ThreadGroup dva konstruktory ThreadGroup(String name) a ThreadGroup(ThreadGroup parent, String name) metoda activecount() vrací počet podskupin ve skupině metoda activegroupcount() vrací počet podprocesů ve skupině metoda getmaxpriority() maximální priorita v dané skupině metoda getparent() vrátí rodičovskou skupinu procesů metoda boolean parentof(threadgroup) vrací zda je rodičem skupiny předané v argumentu shodné metody pro řízení vláken jako třída Thread, viz API Seminář Java VIII p35/36

Vložení podprocesu do skupiny předáním skupiny podprocesů do jednoho z konstruktorů třídy tt Thread např Thread(ThreadGroup group, String name) Seminář Java VIII p36/36