Programozási nyelvek és módszerek Java Thread-ek

Hasonló dokumentumok
Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Concurrency in Swing

Szoftvertechnológia alapjai Java előadások

VIII. Szálak és animáció

Végrehajtási szálak - kiegészítések. Szinkronizálás, érvénytelenített metódusok helyettesítése

Programozási technológia 2.

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

S ha kettészelik is: balfelöl belőle Valamivel mindig - Valamivel mindiq több marad. (Nyugat )

C# Szálkezelés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Szálkezelés / 21

Párhuzamosság. Java a párhuzamosítást több féle képpen támogatja.

Magas szintű programozási nyelvek 2 Előadás jegyzet

Segédanyag: Java alkalmazások gyakorlat

Programozási technológia 2.

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Osztályok. 4. gyakorlat

Abstract osztályok és interface-ek. 7-dik gyakorlat

Programozási nyelvek Java

OOP: Java 8.Gy: Abstract osztályok, interfészek

Java programozási nyelv 4. rész Osztályok II.

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

és az instanceof operátor

Konkurens TCP Szerver

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Java és web programozás

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

OOP: Java 8.Gy: Gyakorlás

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

Java és web programozás

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Java és web programozás

OOP #14 (referencia-elv)

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Segédanyag: Java alkalmazások gyakorlat

7. K: JAVA alapok Konzultáció

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Java Programozás 3. Gy: Java GUI. Swing, AWT

Java programozási nyelv 5. rész Osztályok III.

Operációs rendszerek. Az Executive és a kernel Policy és mechanizmusok szeparálása Executive: policy - objektum kezelés Kernel: mechanizmusok:

Processzusok (Processes), Szálak (Threads), Kommunikáció (IPC, Inter-Process Communication)

Az új be- és kimenet könyvtár

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Java Programozás 11. Ea: MVC modell

Operációs rendszerek. 3. előadás Ütemezés

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Programozási nyelvek Java

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Programozás C++ -ban 2007/7

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Az emelt szintű. informatika érettségi. programozási feladatainak. megoldása Java nyelven. NetBeans IDE 8.1 környezetben

Pa rhuzamossa g. Java tutorial. Alkalmazasi teruletek. Cel. Pa rhuzamossa gi modellek. Ha egy processzor van...

Programozási nyelvek II.: JAVA

Programozási nyelvek Java

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Tervminták a valósidejű gyakorlatban

BME MOGI Gépészeti informatika 4.

Kölcsönös kizárás, atomicitás, szemafor.

Programozási alapismeretek 4.

3. Osztályok II. Programozás II

Grafikus felhasználói felületek. Abstract Window Toolkit, a java.awt és java.awt.event csomagok

C++ programozási nyelv

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Java és web programozás

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Szoftvertechnolo gia gyakorlat

JAVA PROGRAMOZÁS 2.ELŐADÁS

XML adatkezelés I. Az SAX szabvány. Dr. Kovács László Miskolci Egyetem Általános Informatikai Tanszék. XML adatok kezelési lehetőségei

C++ programozási nyelv Konstruktorok-destruktorok

Java gyakorlat feladatai e s megolda sai ( )

Objektum Orientált Programozás. 5. JAVA osztályok 21/1B IT MAN

Programozás II. 4. Dr. Iványi Péter

Objektumorientált programozás C# nyelven

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Fejezetek az "Effective Java" c. könyvből

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

BME MOGI Gépészeti informatika 8.

Kivételkezelés, naplózás. Exception handling, logging

Objektumorientált programozás C# nyelven III.

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Programozás I. Első ZH segédlet

Programozási nyelvek II.: JAVA, 11. gyakorlat

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Szálkezelés Rajzolás képernyőre Bevitel kezelése - Érintő képernyő - Billentyűzet

Programozás C++ -ban

Java és web programozás

Uniprogramozás. várakozás. várakozás. Program A. Idő. A programnak várakoznia kell az I/Outasítások végrehajtására mielőtt továbbfuthatna

Programozási technológia 2.

ZH mintapélda. Feladat. Felület

Java programozási nyelv 9. rész Kivételkezelés

Java IX. telkezelés a Java-ban

Kalapácsvetés 2016 szöveges

Java IX. telkezelés a Java-ban

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Java programozási nyelv

Átírás:

Programozási nyelvek és módszerek Java Thread-ek Laki Sándor lakis@inf.elte.hu 2006. május 3. 0-0

Szálak (Threads) Ahhoz, hogy egy mai rendszer m ködhessen több 10-100 folyamatnak kell futnia. A folyamatok futtatása ütemezést igényel, mivel egy gépben általában egy processzor van. Ekkor az operációs rendszernek kell ütemeznie azok futását. Ahhoz, hogy egy folyamat futását megszakítsuk, hogy egy másik futhasson, ahhoz az adott folyamatot folytatható állapotba kell helyezni, le kell menteni a változóit. Ezek m veletek nem segítik a folyamatok futását, overhead-nek nevezzük az ilyen fajta - a végrehajtás szempontjából nem hasznos - m veleteket. Ütemezéskor két ellentétes stratégiát feltételez igényt kell kielégíteni. Minél gyorsabban fussanak a folyamatok: ebb l a szempontból az lenne a legjobb, ha minden folyamat végigfutna, miel tt újat indítanánk. Minél simábban fussanak a folyamatok: a felhasználó nem szeretné észrevenni, hogy nem csak az fut, amivel foglalkozik, 0-1

pedig hát... Ebb l a szempontból minél gyakrabban kellene váltogatni a folyamatokat Az ütemez nek e két stratégia között kell optimumot találnia, és persze ne felejtsük el, hogy az ütemez is egy folyamat! 0-2

Processzek - Szálak Amikor egy operációs rendszer process-eket futtat, akkor ezek külön memóriaterületen futnak, (esetleg osztott memóriát használnak). A szálak hasonlóképpen tudnak az operációs rendszeren párhuzamosan futni. Abban különböznek a process-ekt l, hogy azonos memóriaterületein futnak, ezért el tudják olvasni egymás változóit. Persze ezt meg kell oldani. Például mp3 lejátszáskor külön szál tömöríti ki a fájlt egy puerbe, amib l a másik szál kiolvassa és lejátssza az adatokat. Hogyan áll le egy szál? Vagy mond le a futás jogáról, vagy az ütemez dönti el, hogy ez a szál most már ne fusson (preemptív). Java-ban nem lehet tudni, hogy az ütemez hogyan m ködik, az operációs rendszerre van bízva. 0-3

Itt feltételeztük, hogy egymástól függetlenül futnak. Ez nincsen mindig így, van, amikor egymásra vagy er forrásra várnak (blokkolt állapot tipikusan I/O m velet esetén) végül minden szálnak véget ér a futása. (stop) 0-4

Szál létrehozása 1. út: Leszármaztatunk a java.lang.thread oszutályból, és felüldeniáljuk a public void run() metódusát! public class MyThread extends Thread { public MyThread() {super(); public void run() { while (true) System.out.println(Futok!!!); Ezzel deniáltuk a szálat leíró osztályt! 0-5

Szál létrehozása 1.út: Szál létrehozása és elindítása: MyThread first = new MyThread(); MyThread second = new MyThread(); // Ezzel még nem futnak, meg el kell indítanunk. first.start(); second.start(); 0-6

Szál létrehozása 2. út: Megvalósítjuk java.lang.runnable interfészt, és ezzel paraméterezve hozunk létre egy Thread objektumot! public class MyThread implements Runnable { public MyThread() { public void run() { while (true) System.out.println(Futok!!!); Ezzel deniáltuk a szálat leíró osztályt! 0-7

Szál létrehozása 2.út: Szál létrehozása és elindítása: MyThread first = new MyThread(); MyThread second = new MyThread(); // Ezek még nem szálak... // szálak létrehozása: Thread t1 = new Thread( first ); Thread t2 = new Thread( second ); t1.start(); t2.start(); Megjegyzés: Lehetne így is: (new Thread( first )).start(); 0-8

Szál befejez dése Amikor a a run metódus végére ér. Ekkor ún. dead állapotba kerül. A GC csak a dead állapotban lev szál objektumokat szabadíthatja fel. 0-9

Feladat: Írj olyan osztályt, ami implementálja a Runnable interfészt. Konstruktorában paraméterként megkap egy Stringet, a szál nevét. Majd ezt végtelen ciklusban írja a képerny re. Hozz létre két szálat: Jancsit és Julcsát. 0-10

Feladat: Legyen adott: public class Tarolo { static int adat; /** Creates a new instance of Tarolo */ public Tarolo() { Készíts két szálat: Mindegyik növelje a Tarolo.a értékét egyesével egészen 1000000-ig. Az eredményt irasd ki a képerny re! Mi a probléma? 0-11

1. átírás: Írjunk a tárolónak inkrementáló fv.-t! public static void increment(){ int i = adat; try { Thread.sleep(300); catch(exception e){ adat = i + 1; System.out.println(i+1); // A try-catch ide azért k Mi itt a probléma? 0-12

2. átírás: Megoldás: synchronized kulcsszó Egy objektum szinkronizált metódusai közül csak egy lehet aktív, és ez is csak egy példányban futhat! Ezt szokás monitornak nevezni. A szinkronizált metódusok között kölcsönös kizárást(mutual exclusion) bíztosít. synchronized public static void increment(){ int i = adat; try { Thread.sleep(300); catch(exception e){ adat = i + 1; System.out.println(i+1); 0-13

Egyébb lehet ségek: sleep( id ) - Adott ideig felfüggeszti a szál végrehajtását.(semmi sem garantálja, hogy nem ébred fel el bb.)(elaltatás) wait() - Szál felfüggesztése, amíg valaki ki nem adja rá a notify v. a notifyall hívást.(blokkolás) wait( id ) - Adott ideig vár, hogy valaki megszólítsa.(blokkolás) notify() - Szál újra aktivizálása.(felszabadítás) notifyall() - Minden várakozó szál felszabadítása. interrupt() yield() - Szól az ütemez nek, hogy lemond a futás jogáról. setpriority( érték ) - Szál prioritása. 0-14

Feladat(Termel - fogyasztó): Hozz létre egy tároló osztályt! Ebben egy int-et lehessen tárolni. Legyen egy put ill. egy get m velete az elem berakásához és kivételéhez. Hozz létre két szálat: Az egyik generáljon random értékeket. És rakja ezeket a tárolóba. A másik vegye ki az elemeket a tárolóból. Oldd meg, hogy üres tárolóból ne lehessen kivenni elemet, ill. tárolóba ne lehessen betenni! tele 0-15

Kocsma-szimulátor: Hozd létre a következ osztályokat: Kocsma, Részeg, melyeket a runnable megvalósításásval kapsz. Írj kocsma szimulátort! A részegek (szálak) a kocsmába egy ajtó taskon keresztül tudnak bemenni. A kocsmában csak öt ember fér el, ennél több nem mehet be az ajtón. Azonban hét részeg próbál bejutni. Aki bejutott, megiszik egy sört 10 mp alatt, majd kimegy, és rögtön megy vissza. Aki nem jut be, az alszik egyet a parkban 5 mp-ig, majd újra próbálkozik. A szimulációban írd ki, hogy melyik részeg mit csinál! 0-16

Lock objektumok! A java.util.concurrent.locks csomagban van egy Lock ill. egy Condition interfész. A Lock egy megvalósítása a ReentrantLock. Ezt fogjuk használni. Példa: Író-Olvasó probléma import java.util.concurrent.*; public class BoundedBuffer<Data> { private Data buffer[]; private int first; private int last; private int numberinbuffer; private int size; private Lock lock = new ReentrantLock(); private final Condition notfull = lock.newcondition(); private final Condition notempty = Lock.newCondition(); 0-17

public BoundedBuffer(int length) { size = length; buffer = (Data[]) new Object[size]; last = 0; first = 0; numberinbuffer = 0; 0-18

public void put(data item) throws InterruptedException { lock.lock(); try { while (numberinbuffer == size) notfull.await(); last = (last + 1) % size; numberinbuffer++; buffer[last] = item; notempty.signal(); finally { lock.unlock(); 0-19

public Data get() throws InterruptedException { lock.lock(); try { while (numberinbuffer == 0) notempty.await(); first = (first + 1) % size ; numberinbuffer--; notfull.signal(); return buffer[first]; finally { lock.unlock(); 0-20