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



Podobné dokumenty
Vláknové programování část IV

Java a Caché IV: Manipulace s objekty

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

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

MS Word 2007 REVIZE DOKUMENTU A KOMENTÁŘE

ÚVOD DO HRY PRINCIP HRY

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

Business Contact Manager Správa kontaktů pro tisk štítků

Cílem kapitoly je seznámit studenta se strukturou programu a jeho překladem.

3 Vývojová prostředí, základní prvky jazyka Java, konvence jazyka Java

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Operační systém z hlediska procesu Mgr. Josef Horálek

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

boolean hasnext() Object next() void remove() Kolekce

Střední průmyslová škola a Vyšší odborná škola technická Brno, Sokolská 1. Podpora digitalizace a využití ICT na SPŠ CZ.1.07/1.5.00/34.

Výrazy lze též zavést v nečíselných oborech, pak konstanty označuji jeden určitý prvek a obor proměnné není množina čísel.

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

MĚŘENÍ NÁKLADŮ, VÝKONNOSTI

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

MODEL HYDRAULICKÉHO SAMOSVORNÉHO OBVODU

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

Cvičení č. 6. Synchronizace ve Windows. 3 Body

Novinky verze ArCon 14 Small Business

2.1. Pojem funkce a její vlastnosti. Reálná funkce f jedné reálné proměnné x je taková

Prostory jmen. #include<iostream.h> namespace RadimuvProstor { int secti(int a, int b); class Trida { private: int Atribut; public: void metoda();

RMI Remote Method Invocation

Digitální učební materiál

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

Želva se nachází v tzv. grafickém okně (zviditelníme ji klávesou +), v němž jsou vidět i čáry, které nakreslila.

Modul pro testování elektrických obvodů

TRANSFORMACE. Verze 4.0

B Kvantitativní test. Semestrální práce TUR. Novotný Michal

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

JAVA V Vlákna Java, zimní semestr

KTE / ZPE Informační technologie

MATERIÁL NA JEDNÁNÍ Zastupitelstva města Doksy

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

Projekt: Výzkumné šetření informovanosti o vypnutí zemského analogového televizního vysílání v územní oblasti Brno město.

Specifikace předmětu plnění veřejné zakázky: Poskytování mobilních hlasových a datových služeb pro potřeby Města Uherské Hradiště

Příručka pro práci s dataloggerem Labquest 2. Zapínání a domácí obrazovka

Algoritmizace a programování

Programování pro deskriptivní geometrii

Asymptoty grafu funkce

Algoritmizace a programování

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

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

Fyzikální praktikum 3 - úloha 7

Ceník tarifů a služeb pro tarifní a Twist zákazníky T-Mobile platný k

Abstraktní datové typy: zásobník

Programování v Javě I. Leden 2008

AMU1 Monitorování bezpečného života letounu (RYCHLÝ PŘEHLED)

Název materiálu: Počasí a podnebí - opakování

Lekce 2 LEGO Education (3,5 vyuč. hodiny)

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

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

VÝROBEK V MARKETINGOVÉM MIXU. doc. PhDr. Dušan Pavlů, CSc. dusan.pavlu@vsfs.cz

Nemocnice a centra zobrazovacích metod d v ují systém m Rimage pro publikování disk s informacemi o pacientech, které mohou zachránit život

Ozobot aktivita lov velikonočních vajíček

Procházka na provázku

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT. Cyklus while, do-while, dělitelnost, Euklidův algoritmus

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

IT jako služba konference ISSS Autor prezentace: Otakar Školoud

Pocasicz.cz / pocasiesk.sk - zadání výroby

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

INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ. Výukový materiál zpracován v rámci projektu EU peníze školám. Registrační číslo projektu: CZ.1.07/1.5.00/34.

Poruchy modul pro rychlé hlášení poruch z provozu.

Témata pro doktorandské studium

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

Katedra obecné elektrotechniky Fakulta elektrotechniky a informatiky, VŠB - TU Ostrava 16. ZÁKLADY LOGICKÉHO ŘÍZENÍ

Návrh softwarových systém. Návrh softwarových systémů

2.6.4 Lineární lomené funkce s absolutní hodnotou

ISZR Referenční agent.net

Operační systémy - modelování a algoritmy paralelních výpočtů

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

16. Projekt Hádání slov

OBEC PŘIBYSLAVICE. Zastupitelstvo obce Přibyslavice. Obecně závazná vyhláška. Obce Přibyslavice Č. 1/2015

JAK ZVLÁDNOUT E-LEARNINGOVÝ KURZ

Návrhové vzory. Každý návrhový vzor má následující strukturu: Většina publikací návrhové vzory člení do následujících kategorií:

KALOVÉ KOŠE KOŠE DO ULIČNÍCH VPUSTÍ KOŠE DO DVORNÍCH VPUSTÍ LAPAČE NEČISTOT

Seznámení žáků s pojmem makra, možnosti využití, praktické vytvoření makra.

Účetní případ MD D DOTACE OD ZŘIZOVATELE. Neinvestiční dotace (1/12, čtvrtletní platby, mimořádné platby) předpis x úhrada

7. Dynamické datové struktury

Používání služebních mobilních telefonů a prostředků pro přenos dat

E-škola návod pro rodiče

Karty externích médií

Návod na sestavení naháněcí ohrady

Elektrická měření 4: 4/ Osciloskop (blokové schéma, činnost bloků, zobrazení průběhu na stínítku )

Android Elizabeth. Verze: 1.3

ZÁKLADNÍ POVINNOSTI DOPRAVCE I PRÁCI S DATY Z DIGITÁLNÍHO TACHOGRAFU

Oborové číslo Hodnocení - část A Hodnocení - část B Hodnocení - část A+B

Koncept bezbariérového vstupu ZŠ Žižkova, Turnov

V této části manuálu bude popsán postup jak vytvářet a modifikovat stránky v publikačním systému Moris a jak plně využít všech možností systému.

Zvyšování kvality výuky technických oborů

Jan Březina. Technical University of Liberec. 17. března 2015

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Novinky v programu Majetek 2.06

František Hudek. červen ročník. Nastavení myši, místní a jazykové nastavení.

Iterator & for cyklus

Návod k obsluze programu ERVE4

19 Jednočipové mikropočítače

Transkript:

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

java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks Knihovny, které jsou nepostradatelné 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 1.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 Od Javy 5.0 je totiž možné využít neblokující algoritmy.

Třída BlockingQueue 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(); Popis jednotlivých implementací LinkedBlockingQueue - neomezená délka fronty 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 Třídy BlockingQueue put(e e ) - vloží určitou položku do fronty a nebo čeká dokud se neuvolní místo take() vrací a maže aktuálně vybranou položku a nebo čeká až bude daná položka dostupná offer(e e, long timeout, TimeUnit unit ) nastavení časového intervalu, za jak dlouho bude daná položka dostupná pro přidání do fronty poll(long timeout, TimeUnit unit ) nastavení časového intervalu, za jak dlouho bude daná položka dostupná pro odebrání z fronty add(e e) umožňuje přidat danou položku do fronty pokud je to možné a pokud ne vyhodí vyjimku (IllegalStateException) remove(object o) vymaže jednu 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ě Další metody zděděné z java.util.queue: element, peek, poll, remove Výkonnostní srovnání Způsob Testování public static void testarraylist(){ System.out.println("Arraylist:"); List<String> list = Collections.synchronizedList(new ArrayList<String>()); //vkladani long caspred = System.nanoTime(); synchronized(list) { for(integer i = 0;i<100000;i++){ list.add(i.tostring()); long caspo = System.nanoTime(); System.out.println((casPo-casPred)); //hledani long caspredhledanim = System.nanoTime(); if(list.contains("0")){ long caspohledani = System.nanoTime(); System.out.println( (caspohledani-caspredhledanim)); if(list.contains("49999")){ long caspohledani = System.nanoTime(); System.out.println((casPoHledani-casPredHledanim)); if(list.contains("99999")){ long caspohledani = System.nanoTime(); System.out.println((casPoHledani-casPredHledanim) );

Výsledky Arraylist HashSet LinkedList ArrayBlockingQueue-FIFO Vkládání 128369946 239278344 150712395 71223633 Hledání 1. prvku 52185 54141 63528 62522 Hledání středního prvku 4474535 142867 6771755 5393479 Hledání posledního prvku 9988085 220140 16699832 11669752 ArrayBlockingQueue ConcurrentLinkedQueue LinkedBlockingQueue 88350056 67440918 109588565 53359 57829 322834 1606685 5916227 10952397 5553890 13228329 25016867 PriorityBlockingQueue PriorityQueue 90082790 98255002 52409 44308 3263376 1141877 10606264 5239884 250000000 200000000 150000000 100000000 50000000 Arraylist HashSet LinkedList ArrayBlockingQueue-FIFO ArrayBlockingQueue ConcurrentLinkedQueue LinkedBlockingQueue PriorityBlockingQueue PriorityQueue 0 Vkládání Hledání 1. prvku Hledání středního prvku Hledání posledního prvku

Příklad: Producent a konzument package Queue; import java.util.concurrent.*; public class main { /** * @param args */ 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(); package Queue; import java.util.random; import java.util.concurrent.blockingqueue; public class Producent implements Runnable { private final BlockingQueue fronta; //vytvoreni fronty 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 System.out.println("velikost fronty: " + fronta.size()); catch (InterruptedException ex) { ex.printstacktrace(); private int produkuje() { int nahoda = generator.nextint(30); System.out.println("přídá:" + nahoda); return nahoda;

package Queue; import java.util.concurrent.blockingqueue; public class Konzument implements Runnable { private final BlockingQueue fronta; //vytvoreni fronty 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 tak(), 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ů

thread-safe, ale i paralelní fronta Třída ConcurrentLinkedQueue Fronta ConcurrentLinkedQueue může mít více producentů i konzumentů. Přechody mezi stavy vlákna new new thread start Ve frontě. Možné řešení: Wait, sleep, notify blocked yield runnable running Přidělen procesor Metoda run skončí dead

Rozdíl mezi CAS a synchronizovaným seznamem CAS zkratka pro Compare-And-Swap instrukci, která stojí za celým packagem java.util.concurrent 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 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ích možná nebude.