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



Podobné dokumenty
Vláknové programování

Vláknové programování

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

Algoritmizace a programování

Programování v Javě I. Leden 2008

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

Typický prvek kolekce pro české řazení

Jazyk C# (seminář 6)

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

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

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

Úvod do programovacích jazyků (Java)

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

Zápis programu v jazyce C#

KTE / ZPE Informační technologie

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

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

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

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

RMI Remote Method Invocation

Java Výjimky Java, zimní semestr

Principy objektově orientovaného programování

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

Abstraktní datové typy: zásobník

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

Bakalářská práce. Vizualizace a editace molekul proteinu

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

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

typová konverze typová inference

PREPROCESOR POKRAČOVÁNÍ

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

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

Datové struktury. alg12 1

Java Enum Java, zimní semestr ,2017 1

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

Java Řetězce Java, zimní semestr

Generické programování

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

Iterator & for cyklus

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

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

PB161 Programování v jazyce C++ Přednáška 5

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

7. Datové typy v Javě

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

Teoretické minimum z PJV

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

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

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

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

IB111 Úvod do programování skrze Python Přednáška 7

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

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

Objektově orientované programování

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é

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

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

Objektově orientované programování v PHP 5. Martin Klíma

JAVA. Třídy a classloader

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

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

PB161 Programování v jazyce C++ Přednáška 4

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

JAVA. Krátke poznámky:

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

Vícevláknové aplikace

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

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

PB161 Programování v jazyce C++ Přednáška 4

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/

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

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

UJO Framework. revoluční architektura beans. verze

Úvod do programovacích jazyků (Java)

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Dědičnost (inheritance)

Singleton obsah. n Motivace. n Základní myšlenka. n Implementace. n Problémy. n Dědičnost. n Obecná implementace. n Shrnutí.

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

GUI. Systémová integrace pro desktopové aplikace

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

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Seminář Java IV p.1/38

Textové soubory. alg9 1

X-komponenty 3.1. Uživatelská příručka. J. Kocman, V. Trojan

PB161 Programování v jazyce C++ Přednáška 5

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

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

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

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

Úvod do programování v jazyce Java

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

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Komponenty v.net. Obsah přednášky

JSR tutorial 2 Transformace v JSR-184

Katedra měřicí a řídicí techniky, VŠB - Technická univerzita v Ostravě, tř. 17. listopadu, Ostrava-Poruba, Česká republika

3 KTE / ZPE Informační technologie

1. Programování proti rozhraní

RMI - Distribuované objekty v Javě

Čipové karty Lekařská informatika

Transkript:

Vláknové programování část V Lukáš Hejmánek, Petr Holub {xhejtman,hopet@ics.muni.cz Laboratoř pokročilých síťových technologií PV192 2014 03 25 1/25

Přehled přednášky Paměťový model Javy GUI v Javě Vlákna a JNI 2/25

long promenna = 10000000L; 3/25

Paměťový model Javy happens-before částečné uspořádání Tabulka převzata z JCiP, Goetz 4/25

Paměťový model Javy Tabulka převzata z JCiP, Goetz 5/25

Paměťový model Javy Piggybacking spojení happens-before pravidla s jiným pravidlem, obvykle monitorem nebo volatile raději nepoužívat příklad: http://kickjava.com/src/java/util/ concurrent/futuretask.java.htm postaveno na tryreleaseshared happens-before tryacquireshared kombinace volatilní proměnné runner, do které tryreleaseshared zapisuje s program order 6/25

Paměťový model Javy void innerset(v v) { 2 for (;;) { int s = getstate(); 4 if (ranorcancelled(s)) return; 6 if (compareandsetstate(s, RAN)) break; 8 result = v; 10 releaseshared(0); done(); 12 V innerget() throws InterruptedException JavaDoc, ExecutionException Jav 2 acquiresharedinterruptibly(0); if (getstate() == CANCELLED) 4 throw new CancellationException JavaDoc(); if (exception!= null) 6 throw new ExecutionException JavaDoc(exception); return result; 8 7/25

Paměťový model Javy 1 protected int tryacquireshared(int ignore) { return innerisdone()? 1 : -1; 3 5 /** * Implements AQS base release to always signal after setting 7 * final done status by nulling runner thread. */ 9 protected boolean tryreleaseshared(int ignore) { runner = null; 11 return true; 13 boolean inneriscancelled() { 15 return getstate() == CANCELLED; 17 boolean innerisdone() { 19 return ranorcancelled(getstate()) && runner == null; 8/25

Paměťový model Javy líná inicializace public class UnsafeLazyInitialization { 2 private static Resource resource; 4 public static Resource getinstance() { if (resource == null) 6 resource = new Resource(); // unsafe publication return resource; 8 10 static class Resource { 12 9/25

Paměťový model Javy @ThreadSafe 2 public class SafeLazyInitialization { private static Resource resource; 4 public synchronized static Resource getinstance() { 6 if (resource == null) resource = new Resource(); 8 return resource; 10 static class Resource { 12 líná inicializace thread-safe 10/25

Paměťový model Javy @ThreadSafe 2 public class EagerInitialization { private static Resource resource = new Resource(); 4 public static Resource getresource() { 6 return resource; 8 static class Resource { 10 dychtivá inicializace využívá skutečnosti, že statické inicializátory jsou vždy dokončeny před použitím třídy 11/25

Paměťový model Javy @ThreadSafe 2 public class ResourceFactory { private static class ResourceHolder { 4 public static Resource resource = new Resource(); 6 public static Resource getresource() { 8 return ResourceFactory.ResourceHolder.resource; 10 static class Resource { 12 idiom líné inicializace s použitím holder class využívá líné inicializace tříd 12/25

Paměťový model Javy public class DoubleCheckedLocking { 2 private static Resource resource; 4 public static Resource getinstance() { if (resource == null) { 6 synchronized (DoubleCheckedLocking.class) { if (resource == null) 8 resource = new Resource(); 10 return resource; 12 13/25

Paměťový model Javy public class DoubleCheckedLocking { 2 private static Resource resource; 4 public static Resource getinstance() { if (resource == null) { 6 synchronized (DoubleCheckedLocking.class) { if (resource == null) 8 resource = new Resource(); 10 return resource; 12 Double Checked Locking anti-pattern pomíjí možnost, že resource je v nedefinovaném stavu od Java 5.0 možno spravit použitím volatile nepoužívat ani v C/C++! 14/25

Java SWING Multiplatformní GUI v Javě SWING single-thread rule všechny prvky mohou být vytvářeny, měněny a dotazovány pouze z vlákna obsluhujícího události SwingUtilities.isEventDispatchThread kontrola, zda jsme ve vlákně obsluhující události SwingUtilities.invokeLater předávání Runnable do vlákna obsluhujícího události SwingUtilities.invokeAndWait předávání Runnable do vlákna obsluhujícího události a zablokuje se do dokončení akce callbacky se řeší pomocí akcí action listener z vlákna obsluhujícího události dlouho běžící callbacky je možno odštípnout do nového vlákna (přímo nebo přes Executory) 15/25

Java SWING Inicializace public class JavaGUI { 2 public static void main(string[] args) { 4 CounterDialog dialog = new CounterDialog(); dialog.setsize(400,300); 6 dialog.setvisible(true); 8 16/25

Java SWING Předávání vláknu událostí SWINGu @Override 2 public void run() { for (int i = 0; i <= 1000; i++) { 4 if (shouldshutdown.get()) { break; 6 final String labeltext = String.valueOf(i); 8 javax.swing.swingutilities.invokelater(new Runnable() { public void run() { 10 counterlabel.settext(labeltext); 12 ); try { 14 Thread.sleep(1000); catch (InterruptedException ignored) { 16 18 runbutton.settext("run"); runbutton.setenabled(true); 20 17/25

Callbacky Java SWING 1 buttonrun.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { 3 onrun(); 5 ); private void onrun() { 2 if (!isrunning.get()) { buttonrun.settext("stop"); 4 isrunning.set(true); if (counterthread!= null) { 6 try { counterthread.join(); 8 catch (InterruptedException ignored) { 10 counterthread = new CounterThread(counterLabel, buttonrun); 12 counterthread.start(); else { 14 buttonrun.setenabled(false); counterthread.requestshutdown(); 16 counterthread.interrupt(); isrunning.set(false); 18 18/25

Volání nativních metod z Javy Struktura JNI volání Java Native Interfaces /* C */ 2 JNIEXPORT void JNICALL Java_ClassName_MethodName (JNIEnv *env, jobject obj, jstring javastring) 4 { //ziskani nativniho retezce z javastring 6 const char *nativestring = (*env)->getstringutfchars(env, javastring, 0);... 8 //nezapomenout uvolnit! (*env)->releasestringutfchars(env, javastring, nativestring); 10 12 // C++ JNIEXPORT void JNICALL Java_ClassName_MethodName 14 (JNIEnv *env, jobject obj, jstring javastring) { 16 //ziskani nativniho retezce z javastring const char *nativestring = env->getstringutfchars(javastring, 0); 18... //nezapomenout uvolnit! 20 env->releasestringutfchars(javastring, nativestring); 19/25

Vlákna a JNI Ukazatel na JNIEnv je platný pouze z vlákna, jemuž je přiřazen nelze předávat mezi vlákny stejný při opakovaných voláních v témže vlákně Lokální reference nesmí opustit vlákno lokální reference jsou platné pouze v rámci daného volání nelze se je uschovávat ve static proměnných převést na globální, pokud je třeba (NewGlobalRef) globální reference vylučují objekt z garbage collection existují slabé lokální reference (NewWeakGlobalRef) umožňují garbage collection odkazovaného objektu potřeba kvůli class unloading musí se kontrolovat, zda odkazovaný objekt existuje (IsSameObject s NULL parametrem) 20/25

Vlákna a JNI static jclass stringclass = NULL; 2... if (stringclass == NULL) { 4 jclass localrefcls = (*env)->findclass(env, "java/lang/string"); 6 if (localrefcls == NULL) { return NULL; /* exception thrown */ 8 /* Create a global reference */ 10 stringclass = (*env)->newglobalref(env, localrefcls); 12 /* The local reference is no longer useful */ (*env)->deletelocalref(env, localrefcls); 14 /* Is the global reference created successfully? */ 16 if (stringclass == NULL) { return NULL; /* out of memory exception thrown */ 18 20... // potreba explicitne mazat 22 if (terminate) { (*env)->deleteglobalref(env, stringclass); 24 Zdroj: JNI Book 21/25

Vlákna a JNI Použití monitorů vždy monitor uvolnit synchronized (obj) { 2... // synchronized block 1 if ((*env)->monitorenter(env, obj)!= JNI_OK)...;... 3 if ((*env)->exceptionoccurred(env)) {... /* exception handling */ 5 /* remember to call MonitorExit here */ if ((*env)->monitorexit(env, obj)!= JNI_OK)...; 7... /* Normal execution path. */ 9 if ((*env)->monitorexit(env, obj)!= JNI_OK)...; Zdroj: JNI Book 22/25

Vlákna a JNI Wait/Notify generické volání metod (GetMethodID, CallVoidMethod) potřeba držet monitor 1 /* precomputed method IDs */ static jmethodid MID_Object_wait; 3 static jmethodid MID_Object_notify; static jmethodid MID_Object_notifyAll; 5 void 7 JNU_MonitorWait(JNIEnv *env, jobject object, jlong timeout) { (*env)->callvoidmethod(env, object, MID_Object_wait, timeout); 9 11 void JNU_MonitorNotify(JNIEnv *env, jobject object) { 13 (*env)->callvoidmethod(env, object, MID_Object_notify); 15 void 17 JNU_MonitorNotifyAll(JNIEnv *env, jobject object) { (*env)->callvoidmethod(env, object, MID_Object_notifyAll); 19 Zdroj: JNI Book 23/25

Vlákna a JNI Explicitní získání JNIenv pro stávající vlákno např. callback volaný OS odkaz na JavaVM lze předávat mezi voláními a vlákny získání odkazu např. JNI_GetCreatedJavaVMs nebo GetJavaVM 1 JavaVM *jvm; /* already set */ 3 f() { JNIEnv *env; 5 (*jvm)->attachcurrentthread(jvm, (void **)&env, NULL);... /* use env */ 7 Zdroj: JNI Book 24/25

Vlákna a JNI Mapování vláknového modelu OS a JVM záleží, zda pro danou platformu JVM podporuje nativní vlákna závisí od dané platformy i od daného JVM Můžeme implementovat v Javě afinitu k CPU závisí od dané platformy i od daného JVM sched_setaffinity(gettid(),...) v praxi může pro danou platformu dobře fungovat 25/25