Fronty (Queue) v JDK 1.5 (1.6) Java.vse.cz.

Slides:



Advertisements
Podobné prezentace
PLAYBOY Kalendar 2007.
Advertisements

CIT Paměti Díl X.
(instance konkrétní třídy)
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Vlastní skript může být umístěn: v hlavičce stránky v těle stránky
Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
Funkce Připomeňme si program pro výpočet faktoriálu:
Přednáška 11 Jiří Šebesta
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Uživatelská rozhraní Uživatelská rozhraní 9. cvičení.
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
Počítače a programování 1. Obsah přednášky Výjimky - základní typy výjimek Způsoby zpracování výjimek.
Databázové systémy II Přednáška č. 6 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Čtvrté cvičení Objektové programování Objektový model v Javě
Desáté cvičení Java Core API Java Collection Framework JavaDoc.
Větvení cykly J a v a Začínáme programovat Lucie Žoltá.
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
J a v a Začínáme programovat Lucie Žoltá. Odkazy - oficiální stránky (překladače, help, metody, vývojové prostředí NetBeans,...)
4IT101 Testování a ladění, dokumentace API třídy,
13AMP 8. přednáška Ing. Martin Molhanec, CSc.. Co jsme se naučili naposled RT jazyky RT jazyky Modula Modula Modula II Modula II.
Kapitoly z metodologie pedagogického výzkumu Prostředí pro výuku algoritmů Vojtěch Ouška.
13AMP 6. přednáška Ing. Martin Molhanec, CSc.. Co jsme se naučili naposled Synchronizace procesů Synchronizace procesů Producent-Konzument Producent-Konzument.
Ing. Josef Veselý Označení šablony a vzdělávací sady viz.rozpis.
C# - Exceptions (výjimky)
Objektové programování
Podpora vláken a jejich synchronizace v jazyce C# Jan Kučera Jan Mittner Petr Effenberger 4IT353 Klient/server aplikace v Javě.
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
PRÁCE S VLÁKNY A APLIKAČNÍ DOMÉNY V.NET FRAMEWORK APLIKACÍCH Architektura technologie.NET Jan Martinovič, FEI - Katedra Informatiky.
Alg91 Textové soubory Na rozdíl od jiných typů souborů jsou textové soubory určené pro gramotné lidské oko. Textový soubor je posloupnost znaků členěná.
Počítače a programování 1
JavaScript Podmínky, cykly a pole.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
Algoritmizace a programování Objektově orientované programování - 16 Mgr. Josef Nožička IKT Algoritmizace a programování
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
IB111 Programování a algoritmizace
Databázové systémy I Cvičení č. 8 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
12/04/20151 Kolekce (1) Kolekce (collection) představují standardní datové struktury (seskupení) prvků (objektů) Jsou definovány ve jmenném prostoru System.Collections.
Šesté cvičení Výjimky Balíky.
Multithread programming Java vs. OpenMP Pavel Zavoral Martin Kugler.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
13AMP 4. přednáška Ing. Martin Molhanec, CSc.. Co jsme se naučili naposled Problém sdílených zdrojů Problém sdílených zdrojů Co je to kritická sekce Co.
C# - konverze datových typů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Vnitřní (operační paměť)
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Pokročilé programování v C++ (část B)
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část I.
Základy operačních systémů Meziprocesová komunikace a synchronizace Jakub Yaghob.
GPGPU Výpočty pomocí grafických procesorů Zpracoval Martin Přeták.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
SOFTWAROVÁ PODPORA PRO VYTVÁŘENÍ FUZZY MODELŮ Knihovna fuzzy procedur Ing. Petr Želasko, VŠB-TU Ostrava.
Výukový materiál zpracován v rámci projektu
ZAL – 3. cvičení 2016.
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Procházka na provázku Program s metodami připomíná knósský labyrint se sály, jimiž se protlouká statečný Theseus, jemuž pro šťastný návrat chytrá Ariadna.
Typový příklad 3 – zadání 1
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Návrhový vzor Flyweight
Abstraktní datové typy
C# přehled vlastností.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Paměť.
ZAL – 7. cvičení 2016.
ALG 14 Vícedimenzionální data Řazení vícedimenzionálních dat
Vlákna v Javě Petr Adámek
Monitor Object 1.
Transkript prezentace:

Fronty (Queue) v JDK 1.5 (1.6) Java.vse.cz

Knihovny, které jsou nepostradatelné java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks

Popis knihoven Ve verzi 1.5 jazyka Java byly přidány nové třídy pro konkurenční programování, které vycházejí z myšlenek Douga Leaho (kniha Concurrent Programming in Java). Obsahují tři hlavní balíčky: java.util.concurrent – Obsahuje prostředky pro vytváření poolů (Executor, Callable, Future) včetně implementace jednoduchého ThreadPoolu, dále implementace konkurenčních front, map, množin a seznamů (poskytují vyšší výkon při konkurenčním přístupu), podpora pro časování s jemnou granularitou a nové synchronizační prostředky (Semaphore, Exchange a podobně). java.util.concurrent.atomic – Jednoduché proměnné s atomickým přístupem (AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference, AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray …) java.util.concurrent.locks – Sada rozhraní pro lepší práci se zámky: Lock, ReadWriteLock, Condition.

Od verze 5 Nový balíček java.util.concurrent Tento balíček obsahuje třídy pro bezpečnou a pohodlnou práci v prostředí multithread(více vláknových) aplikací Implementována bez významného použití synchronized sekcí=> nedochází k tomu, že by vlákna zbytečně stály a nebo čekaly na zámek. obsahují třídy pro paralelní přístup k datům, zámky, semafory,... Od Javy 5.0 je totiž možné využít neblokující algoritmy.

Fronta Kolekce slouží k uchování elementů před zpracováním. Kromě základních operací s kolekcemi nabízí fronty další operace jako přidávání, vybíraní a „inspekci“. Elementy ve frontě jsou obvykle řazeny systémem FIFO (first-in-first-out). Vyjímku tvoří tzv. priority queues(„prioritní fronty“), které řadí prvky podle to, jaký jim nastavíme comparator, připadně podle defaultního řazení pro daný typ. Další výjimkou jsou LIFO fronty(haldy), které, jak už název napovídá, řadí elementy způsobem LIFO (last-in-first-out).

Rozhraní BlockingQueue (Chránicí Fronta) Součastí java.util.concurrent Dědí z tříd: java.until.Queue a java.util.Collection využívá implementace tříd java.util.concurrent umožňuje čekat na položku (např: podle priority, nebo časového intervalu) Toto je zajištěno pomocí těchto implementací: LinkedBlockingQueue ArrayBlockingQueue SynchronousQueue PriorityBlockingQueue DelayQueue Příklad instance BlockingQueue q = new SynchronousQueue(); BlockingQueue je z mnoha

Popis jednotlivých implementací LinkedBlockingQueue - neomezená délka fronty, FIFO PriorityBlockingQueue - přerovnává položky dle priority ArrayBlockingQueue - pevná délka fronty, o to efektivnější SynchronousQueue - fronta nulové délky, nikdy neobsahuje žádnou položku, k výměně jedné položky se musí sejít producent i konzument, přijde-li dříve producent, čeká na konzumenta a naopak DelayQueue - položky přerovnává podle jejich timeoutu, ven je pustí až timeout doběhne, metoda size() sice může vrátit nějaké číslo, jakožto počet položek, ale neznamená to že už vypršel timeout a jsou tedy k dispozici).

Některé Metody Rozhraní BlockingQueue put(E e ) - vloží určitou položku do fronty a nebo čeká dokud se neuvolní místo, při volání je nutné odchytit vyjimkou InterruptedException take() – vrací a maže aktuálně vybranou položku a nebo čeká až bude daná položka dostupná + vyjimka InterruptedException offer(E e) – přidání položky do fronty s tím, že pokud je možné položku přidat do fronty vrátí true a pokud ne, tak false poll(long timeout, TimeUnit unit) – vrátí a odebere vrchol fronty, pokud nelze vrátí null, zde se nastavuje i interval jak dlouho se má čekat na danou položku až bude dostupná. add(E e) – umožňuje přidat danou položku do fronty pokud je to možné a pokud ne je použita vyjímka IllegalStateException remove(Object o) – vymaže jednu danou instanci z fronty Dále například metody(které pochází už z dané implementace): size() – velikost fronty clear() – smaže vše ve frontě …. a další Další metody zděděné z java.util.Queue: element, peek, poll, remove

Příklad: producent a konzument Třída main: package Queue; import java.util.concurrent.*; public class main { public static void main(String[] args) { BlockingQueue q = new SynchronousQueue(); Producent p = new Producent(q); Konzument c = new Konzument(q); Thread vlakno1 = new Thread(p); Thread vlakno2 = new Thread(c); vlakno1.start(); vlakno2.start(); }

Třída producent: package Queue; import java.util.Random; import java.util.concurrent.BlockingQueue; public class Producent implements Runnable { private final BlockingQueue fronta; private Random generator; public Producent(BlockingQueue q) { fronta = q; //vlozeni fronty s danou implementaci generator = new Random(); } public void run() { try { while(true) { fronta.put(produkuje()); //u fronty se provede metoda put(), ktera prida polozku } catch (InterruptedException ex) { ex.printStackTrace(); private int produkuje() { int nahoda = generator.nextInt(30); System.out.println("přidá:" + nahoda); System.out.println("velikost fronty: " + fronta.size()); return nahoda;

Třída Konzument: package Queue; import java.util.concurrent.BlockingQueue; public class Konzument implements Runnable { private final BlockingQueue fronta; public Konzument(BlockingQueue q) { fronta = q; //vlozeni fronty s danou implementaci } public void run() { try { while(true) { konzumovat(fronta.take()); //u fronty se provede metoda take(), ktera vrati polozku a pote odstrani System.out.println("velikost fronty: " + fronta.size()); } catch (InterruptedException ex) { ex.printStackTrace(); private void konzumovat(Object x) { System.out.println("veme:" + x); Závěr: třída BlockingQueue umí bezpečně používat více producentů a konzumentů

ArrayBlockingQueue Část výpisu pří použití ArrayBlockingQueue s parametrem 10: velikost fronty: 5 přidá:9 velikost fronty: 6 přidá:18 velikost fronty: 7 přidá:7 velikost fronty: 8 přidá:13 velikost fronty: 9 přidá:21 velikost fronty: 10 veme:18 veme:20 veme:19 Maximální velikost fronty je 10.

SynchronousQueue Část výpisu pří použití SynchronousQueue : veme:12 velikost fronty: 0 přidá:24 přidá:11 veme:24 veme:11 přidá:16 veme:16 přidá:0 Zde je vidět, že konzument vždy čeká na producenta a naopak a velikost fronty je 0.

LinkedBlockingQueue Část výpisu pří použití LinkedBlockinQueue: přidá:28 velikost fronty: 7630 přidá:29 velikost fronty: 7631 velikost fronty: 7632 přidá:26 velikost fronty: 7633 velikost fronty: 7634 přidá:12 velikost fronty: 7635 přidá:16 velikost fronty: 7636 přidá:10 velikost fronty: 7637 přidá:22 velikost fronty: 7638 Neomezená velikost fronty.

Třída ConcurrentLinkedQueue (thread-safe, ale i paralelní fronta) Fronta ConcurrentLinkedQueue může mít více producentů i konzumentů. Podobná „BlockingQueue“.

CAS- Compare-And-Swap CAS je instrukce, která má tří argumenty paměťové místo M, předpokládanou hodnotu A a novou hodnotu B - CAS(M, A, B). Instrukce udělá to, že se podívá do paměti na místo M, z něj si přečte aktuální hodnotu, kterou porovná s předpokládanou hodnotou A. Pokud jsou stejné, nastaví na místo M novou hodnotu B, pokud se hodnoty nerovnají, neprovede se nic. To podstatné co zbývá o CAS instrukci říct je, že se jedná o atomickou instrukci. Nemůže tak nastat případ, kdy dvě vlákna paralelně mění jedno paměťové místo. Je tak vyloučeno, že by mohlo dojít k tomu, že se ve vláknu X provede porovnání aktuální a předpokládané hodnoty a před nastavením nové hodnoty by vlákno Y tuto hodnotu změnilo

Rozdíl mezi CAS a synchronized Sémantika CAS instrukce je v podstatě stejná jako synchronized s tím rozdílem, že je to na úrovni hardwaru namísto JVM. Z toho vyplývá mnohem lepší výkonnost. Podpora CAS instrukce byla přidána od Javy 5.0 a v API je zpřístupněna v rámci package java.util.concurrent.atomic, kde jsou různá primitiva jako například AtomicInteger či AtomicReference, která modelují CAS instrukci pro různé datové typy. Díky CAS je možné nahradit synchronizaci a to tak, že implementace využije optimistický přístup.

Jak nahradit? Zde je příklad: Představme si jednoduchý counter implementovaný pomocí synchronized bloku. publi class Counter { private int counter; public synchronized int inc() { return counter++; } Oproti tomu s využitím AtomicIntegeru. private final AtomicInteger counter = new AtomicInteger(); public int inc() { return counter.incrementAndGet();

Ještě jedna fronta sun.misc.Queue Lze použít jako střídaní zámku. Používá synchronizovaní. Méně efektivní, než je CAS Nelze se na ní spoléhat V dalších verzí možná nebude.

Metody třídy Queue enqueue(Object obj); dequeue() – metoda vrací nejstarší objekt ve frontě dequeue(long timeOut) metoda vrací Object, který je nejdéle ve frontě. Parametrem je čas, do kdy čeká na příchod objektu. isEmpty() –vrací True nebo False elements() reverseElements();

Přechody mezi stavy vlákna new new thread start Ve frontě. Možné řešení: Wait, sleep, notify runnable Přidělen procesor yield blocked running Metoda „run“ skončí dead

Zdroje: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html http://www.sweb.cz/pichlik/archive/2007_06_17_archive.html http://www.softwaresummit.com/2005/speakers/JenneryAidonConcurrent.pdf

Děkujeme za pozornost! Má někdo nějaký dotaz? Diskuze Děkujeme za pozornost! Má někdo nějaký dotaz?