Programozás III SZÁL PÉLDÁK.

Slides:



Advertisements
Hasonló előadás
Osztály leszármaztatás
Advertisements

Programozás III SZÁLAK + MULTIMÉDIA.
A Powerpoint használata (gyorstalpaló)
Tervezési minták és a PHP 5
Programozás III STRING-XML.
C++ programozási nyelv Gyakorlat hét
Programozás III OOP ALAPOK.
Számítógépes ismeretek 5. óra
Jt Java Feltételek, logikai kifejezések. jt 2 Logikai operátorok Logikai kifejezésekre alkalmazhatók a következő műveletek: 1. nem! 2. és&ill.&& 3. kizáró.
Programozás III KOLLEKCIÓK 2..
Programozás III FACTORY, KOMPOZÍCIÓ és EGYEBEK.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Adatbányászati technikák (VISZM185)
Öröklődés 2..
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Programozási alapismeretek 13. előadás. ELTE Érdekességek - kombinatorika  Az iskola bejáratánál N lépcsőfok van. Egyszerre maximum K fokot tudunk lépni,
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Fejlett Programozási Technológiák II. Világos Zsolt 12. gyakorlat.
Tömbök ismétlés Osztályok Java-ban Garbage collection
Az objektum-orientált tervezési alapelvek kritikai vizsgálata
A körlevél készítésének menete
Java programozási nyelv 3. rész – Osztályok I.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
C# tagfüggvények.
JSP és JavaBean JavaServer Pages és Java Beans Fabók Zsolt Általános Informatikai Tanszék Miskolci Egyetem.
C# tagfüggvények.
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
Programozás I. Ciklusok
A JAVA TECHNOLÓGIA LÉNYEGE Többlépcsős fordítás A JAVA TECHNOLÓGIA LÉNYEGE Platformfüggetlenség.
Hálózati Bombermen Belicza András Konzulens: Rajacsics Tamás BME-AAIT.
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1 Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Web: Magasszintű Programozási Nyelvek I. Eszterházy.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Java programozási nyelv Metódusok
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Programozás III KOLLEKCIÓK.
Logikai programozás 8.. Adatok: ISMÉTLÉS: ADATBÁZISKEZELÉS A külső adatok a hatására bekerülnek a memóriába Lekérdezés: Ahogy eddig – pl.: szereti(jani,
Egyenesvonalú (lineáris) adatszerkezetek
Logikai programozás 5..
Programozás III UNIT TEST. És tényleg: Honnan lehet tudni, hogy működik-e vagy sem?
2. Gyakorlat Zalatnai Csongor
Programozás III OOP ALAPOK.
Programozás III KOLLEKCIÓK.
Gazdasági informatikus - Szövegszerkesztés 1 Hosszú dokumentumok kezelése.
Gráfok ábrázolása teljesen láncoltan
Objektumorientált alapjai ISZAM III.évf. részére Bunkóczi László.
Adatbáziskezelés. Adat és információ Információ –Új ismeret Adat –Az információ formai oldala –Jelsorozat.
Összeállította: Gergely János
(Bináris) Kupac (heap) adattípus
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
Programozás III ÖTLETEK A FELADATMEGOLDÁSHOZ. A HF-EK APROPÓJÁN Néhány javaslat: 1. Jó lenne, ha a feladatmegoldás előtt átnéznék az előadás-anyagokat.
Programozás III SWING. SWING ALKALMAZÁSOK (ISM.) Swing felületű, eseményvezérelt alkalmazás létrehozása: 1.JFrame alapú osztály létrehozása Szerepe: vezérlés.
A Mozilla magyar nyelvű szerkesztőjének használata
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Neumann János Informatikai Kar
Párhuzamos programozás
Neumann János Informatikai Kar
Neumann János Informatikai Kar
Előadás másolata:

Programozás III SZÁL PÉLDÁK

3. FELADAT – PROBLÉMA Hibásan működik.  Hibaforrás: a paintComponent() for ciklusa. Ok: „szálösszeakadás” – konkurens módosítási probléma. Megoldás: ArrayList helyett

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK Hogyan lehet névvel együtt kezelni a színeket? 1. Két tömb (színek, elnevezések) 1. Két tömb (színek, elnevezések) – nagyon fapados  – nagyon fapados  2. Szin osztály + lista 3. Hashmap 4. Enum

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK Hashmap (RajzPanel-en) public static interface Entry<K,V> A map entry (key-value pair). The Map.entrySet method returns a collection-view of the map, whose elements are of this class. …

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK Hashmap (RajzPanel-en) A konkrét feladat (szerintem) nem igényli a hashmap alkalmazását, de nagyon jó példa arra, hogy általában hogyan lehet használni. Ez a szerkezet ugyanis széles körben alkalmazható.

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK Enum (RajzPanel-en vagy külön osztályban is lehet)

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK Enum (RajzPanel-en)

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK „Órás” példa – probléma Nem feltétlenül kerül középre az óra.  Egyik lehetséges megoldás:

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK „Órás” példa – másik megoldási lehetőség Az Ora maga is lehet komponens:

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK Ráhúzható-e a panelre? Igen, mert bean, azaz van üres konstruktora.

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK Ora osztályban:

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK OraPanel osztályban: Ebben az osztályban nem kell paintComponent FONTOS: Csak akkor látszódik, ha a panel BorderLayout!

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK OraPanel osztályban:

KORÁBBI PÉLDÁKKAL KAPCSOLATOS ÉSZREVÉTELEK „Órás” példa Hogyan kerülhet a gombra is egy óra? Saját gomb osztály A gombnyomás hatására elindul/megáll (a gombon lévő óra is )

SZÁLKEZELÉS (ismétlés) : Várakoztatás A varakozas()-t a run()-ban kell meghívni!!! Miért public az egyik és private a másik?

Labda osztály: extends Thread panelen: List<Labda> labdak = PÉLDA Hozzunk létre egy grafikus alkalmazást, amelynek felületén labdák pattognak! Megoldás: Labda osztály: extends Thread panelen: List<Labda> labdak = CopyOnWriteArrayList<>(); (ennek helyét később majd módosítjuk)

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA A példa folytatása: a labdák automatikusan keletkezzenek, majd próbáljuk „levadászni” őket. Probléma: Egy idő után összeakadnak a szálak (ConcurrentModificationException) Oka: a paintComponent() metódusban ki akarjuk rajzolni a lista összes elemét, de közben már a törlés metódus esetleg kitörölte a kirajzolandó elemet. Megoldás: Szinkronizáció Csakhogy ez sajnos néha kevés 

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA Megoldás (ez már tényleg az ): Meg kell várni, amíg teljesen befejezi a rajzolást, és csak utána szabad törölni. Célszerű létrehozni egy szálvezérlő osztályt.

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA Panel-ben: Probléma?

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA SzalVezerlo-ben: Panel-ben: Hogyan érhető el, hogy automatikusan keletkezzenek? A panel is szálként viselkedik  implements Runnable() A beszúrás hívása a run() metódusban.

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA később még módosítjuk

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA Kitérő: Hol indítsuk el a panel-szálat, azaz hol hívjuk meg a Panel szalInditas() metódusát? Ha a Panel konstruktorában hívnánk, akkor már a tervezési fázisban is fogná a gépet. A Frame indit() metódusában vagy a Panel AncestorAdded eseményének hatására.

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA „Levadászás”: Labda-ban: Panel-ben:

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA SzalVezerlo-ben: A törlés nagyon kényes művelet, ha nem lépünk ki azonnal, elszállhat.

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA Kitérő: lehet így is, de jobb az előző A kitérő oka: a törlés mindig nagyon kényes művelet, oda kell rá figyelni.

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA A SzalVezerlo esetleges további metódusai: stb…

EGY GYAKORI PROBLÉMA ÉS MEGOLDÁSA FONTOS: A SZÁLVEZÉRLŐ MINDEN METÓDUSA SZINKRONIZÁLT!!! (kivéve set/get) Általában: amikor több szál osztozik megváltoztatható adatokon, akkor minden olyan szálat, amely írja vagy olvassa az adatokat, szinkronizálni kell.

ÁLLATORVOSI LÓ Csak hogy minél több dologról szó eshessen, bővítsük a feladatot: Rakjunk fel egy gombot, amelynek hatására egyszerre megállítható vagy újraindítható az összes labda. Hogyan marad átméretezéskor is középen a gomb?

ÁLLATORVOSI LÓ Egyik (de nem az egyetlen) lehetséges megoldás: Másik panel + Flow Layout Saját vagy „gyári” panel? Ennél az egyszerű feladatnál lehet „gyári”, de a példa kedvéért most sajátot írunk. Egy kicsit is összetettebb feladat esetén jobb a saját panel. Miért? A várakoztatás/fölengedés megoldása:

ÁLLATORVOSI LÓ VezerloPanel-ben: SzalVezerlo-ben: Labda-ban: ld. a diasorozat elején tárgyalt várakoztatást.

ÁLLATORVOSI LÓ Hogyan oldható meg, hogy mindkét panel ugyanazt a szalVezerlo példányt használja? (Természetesen ekkor egyik panelben sem szabad példányosítani a SzalVezerlo-t. ) Kitérő: miért nem a panelek konstruktorában adjuk át a szálat?

ÁLLATORVOSI LÓ Másik kitérő: A panelek felrakása. Mi történik, ha ez a módosítás sorrendje? Leszedjük a frame-ről az eredeti LabdaPanel-t. Kivesszük a LabdaPanel konstruktorából a szalVezerlo példányosítását. Felrakjuk a frame-re a VezerloPanel-t is és a LabdaPanel-t is. Módosításkor célszerű kikommentezni a korábbi „kényes” hivatkozásokat, majd a panelek ismételt elhelyezése után újra aktívvá tenni ott, ahol kell.

ÁLLATORVOSI LÓ További módosítás: Fárasztó kattintgatni, most a törlést is a program végezze automatikusan. Vagyis két szál kell: beszúr egy újabb labdát; töröl egyet. Ez az úgynevezett Termel – Fogyaszt modell

ÁLLATORVOSI LÓ Panelek szerepe: A vezérlő panel nem kell. A LabdaPanel szerepe csak a kirajzolás, de mivel továbbra is a SzalVezerlo osztály rajzol() metódusát használja, ezért szükség van a setSzalVezerlo() metódusra is. A labdák létrehozásáért a Termel osztály a felelős, a törlésükért a Fogyaszt osztály.

ÁLLATORVOSI LÓ A Termel feladata: Véletlen időközönként létrehoz egy-egy labdát, amelyet a szalVezerlo beszur() metódusa berak a kirajzolandó labdák közé, és el is indítja a mozgását. A labdák csak a panel felületére rajzolhatók, ezért bár véletlen helyen jönnek létre, de a panel határain belül. Ehhez viszont ismerni kell a panel méreteit, és nyilván a panel repaint() metódusát tudjuk meghívni.

ÁLLATORVOSI LÓ Fogyaszt feladata: Véletlenszerűen kiválasztani egy törlendő labdát, és kitöröltetni a szalVezerlo-vel.

ÁLLATORVOSI LÓ SzalVezerlo: Mi a baj? Esetleg akkor is törölni akar, ha nincs egy labda sem.

ÁLLATORVOSI LÓ Javítás: Ügyesebb megoldás lenne várakoztatni a szálat, amíg nincs törlendő. Ezt a változatot most csak konzolos alkalmazásként beszéljük meg, de előbb befejezzük ezt a feladatot.

ÁLLATORVOSI LÓ A Frame: termelesInditas() hívása: a frame indit() metódusában.

TERMEL – FOGYASZT MODELL Egyszerű konzolos alkalmazásként beszéljük meg. Feladat: Van egy raktár, amelybe egy termelő időnként beszállít, ha van még hely a raktárban, egy fogyasztó pedig kivesz árut, ha van kivehető áru. Elvileg megoldhatjuk úgy, mint az előbb, vagyis a méretek figyelésével, de ez esetben fölöslegesen fut a szál akkor is, ha nem tud berakni vagy kivenni a raktárból. Ilyenkor inkább várakoztatni kell a megfelelő szálat.

TERMEL – FOGYASZT MODELL Termelo:

TERMEL – FOGYASZT MODELL Fogyaszto

TERMEL – FOGYASZT MODELL Raktar

TERMEL – FOGYASZT MODELL Raktar

TERMEL – FOGYASZT MODELL Raktar

TERMEL – FOGYASZT MODELL Main:

TERMEL – FOGYASZT MODELL Működés: Minden objektumhoz tartozik egy ún. wait-várakozási sor. A wait() hatására a szál bekerül ebbe. A notify() hatására az egyik várakozó kikerül belőle. A wait() es notify() hívások csak olyan kódrészben szerepelhetnek, amelyek ugyanazon az objektumon szinkronizáltak.

TERMEL – FOGYASZT MODELL HF: Az előző labdás példa ilyen átalakítása. Jónak tűnő anyag: http://www.theorphys.elte.hu/fizinf/HaloAdat/tananyag/java/A_SZALAK/index.html