Dag 10 Flertrådet programmering

Relaterede dokumenter
Dag 10 Flertrådet programmering

Videregående programmering i Java

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Videregående programmering i Java

Objektorienterede metoder

Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004

Parallelle algoritmer

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Videregående programmering i Java

OOP e uge kursusgang: Samtidighed (II) Safety = sikkerhed. Safety

import java.awt.event.*; import java.awt.*; Container <- Panel <- Applet Component <- Button <- Checkbox <- ScrollPane <- Label

Real-time programming safety in Java and Ada

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Databaseadgang fra Java

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

et enkelt kontrol flow sætningerne i programmet afvikles en ad gangen flowet følger dels den tekstlige rækkefølge

Singleton pattern i Java

SWC eksamens-spørgsmål. Oversigt

Videregående programmering i Java

SigmaT.

Parallelle algoritmer

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Software Construction 1 semester (SWC) Spørgsmål 1

Forelæsning Uge 5 Mandag

Eksempel på en database: studenter, kurser, eksamener

Planen for idag. Synkroniseringsmekanismer. Krav til løsning. Kritiske regioner. Bagerens algoritme. Kritisk region via delt lager.

Common Language Runtime. Multithreading

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

DM502. Peter Schneider-Kamp

Eksempel: Skat i år 2000

A Profile for Safety Critical Java

Java Klasse nedarvninger

Løsning af møntproblemet

Hvordan vælger jeg dokumentprofilen?

Mandatory Assignment 1

Hvad er et distribueret objekt? Plan Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

Videregående programmering i Java

Webserverprogrammering

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Ugeseddel 4 1. marts - 8. marts

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller

Test af It-komponent

9.8 Kildekode. side 88. Pakke Klasse Sidenummer. fortsætter..

dmasark Aflevering - Uge 50

Modern Concurrency Abstractions for C#

Tree klassen fra sidste forelæsning

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Kursusgang 11. Oversigt: Sidste kursusgang Værktøjer til udvikling og implementering af HCI-design Oversigt over Java Swing

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections;

3C03 Concurrency: Model-based Design

Videregående programmering i Java

Koordinering. dopsys

public Set(int size) { this.listelement = new LinkedList<Integer>(); }

Forelæsning Uge 5 Mandag

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Forelæsning Uge 2 Torsdag

DANMARKS TEKNISKE UNIVERSITET

Serialization i Java

Forelæsning Uge 3 Torsdag

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 13/ Side 1 af 7

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Forelæsning Uge 2 Torsdag

Kursusarbejde 3 Grundlæggende Programmering

Fundamentale sprogbegreber

MySQL i Java. Tutorial lavet af Jákup W. Hansen TSU semester 05.januar 2007

Nye features i Java 1.7/7.0

Specifikation Abstrakt OO OS-API Rev Specifikation. Abstrakt, objektorienteret operativsystem-api

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.

Nye features i Java 1.5/5.0

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer

BRP Kursusintroduktion og Java-oversigt

DM34-1. Obligatorisk opgave Dilemma spillet. Jacob Aae Mikkelsen kok04

Skriftlig eksamen i Datalogi

Forelæsning Uge 5 Mandag

Kursusarbejde 2 Grundlæggende Programmering

Forelæsning Uge 3 Mandag

Skriftlig eksamen i Datalogi

Forelæsning Uge 2 Torsdag

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations

Forelæsning Uge 6 Mandag

Jacob Christiansen, Institut for MAtematik og DAtalogi, Syddansk Universitet, Odense

Hvad er Objekter - Programmering

Abstrakte datatyper C#-version

Forelæsning Uge 4 Mandag

Linguistic support for unit testing

DM507 Algoritmer og datastrukturer

Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden.

Forelæsning Uge 3 Torsdag

Forelæsning Uge 3 Mandag

Forelæsning Uge 2 Torsdag

Forelæsning Uge 5 Mandag

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Java-opgraderingskursus

Transkript:

Videregående programmering i Java Dag 10 Flertrådet programmering Fremlæggelse af programmering/status for projekter Dokumentation med javadoc Flertrådede designmønstre: Arbejdstråd, Producent Konsument, Trådpulje Evt.: Kommunikation mellem processer og tråde i et GUIprogram Evt.: Synkronisering af processer og tråde, semaforer [TJT] om tråde Evt.: Monitorer, Java synkronisering, Deadlocks Dette materiale er under Åben Dokumentlicens, se

Sidste gang - spørgsmål? Dag 9 Andre designmønstre Andre designmønstre: Uforanderlig, Fluevægt, Lagdelt Initialisering, Komposit/Rekursiv Komposition, Kommando/Ændring Fremlæggelse af programmering/status for projekter Evt.: Brug af Properties filer (og præferencer i JDK 1.4) Evt: Kommunikation med udklipsholder og Drag'n'drop Læsning: VP 18, How to Use Drag and Drop and Data Transfer.

Krav til projektet

Hvordan går det med projektet?

Javadoc /** * Eksempel på en kommenteret klasse. */ public class EnKommenteretKlasse /** * Et eksempel på en metode. Metoden tjener * til at vise hvordan javadoc virker. * * @param enstreng strengen * @param ettal tallet * * @return strengen og tallet sat sammen */ public String enmetode(string enstreng, int ettal) return enstreng+ettal; javadoc EnKommenteretKlasse.java De vigtigste klasser i jeres projekt skal være dokumenteret med Javadoc!

public class BenytSnakkesagligePersoner public static void main(string[] arg) SnakkesagligPerson p = new SnakkesagligPerson(); Samtidighedsproblemet // Opret ny tråd, klar til at udføre p.run() Thread t = new Thread(p); Hvis 2 tråde kommunikerer Fejl, der er svære at finde Løsninger t.start(); // Nu starter personen med at snakke // Det kan også skrives meget kompakt new Thread(new SnakkesagligPerson()).start(); Semaforer Flertrådet programmering - Synchronized (obj) Dyr i CPU tid!! obj.wait() og obj.notify() Flertrådede designmønstre Med JDK1.5: java.util.concurrent resumé tråd = new Thread(obj); tråd.start(); obj implementerer Runnable obj.run() tråd public class SnakkesagligPerson implements Runnable public void run() for (int i=0; i<5; i++) System.out.println("Bla bla bla "+i); try Thread.sleep(ventetid); catch (InterruptedException e)

Designmønstret Producent-Konsument Problem: En separat tråd skal udføre noget (f.eks. nogle opgaver). Opgaverne kommer løbende (fra andre tråde) og skal udføres i rækkefølge. Løsning: Lad de andre tråde producere opgaver, som lægges i en liste. Den separate tråd konsumerer disse opgaver (fjerner dem fra listen og udfører dem) Trådene kommunikerer gennem listen her skal bruges en semafor for at løse samtidighedsproblemet Konsument tråden skal vente på opgaver obj.wait() og obj.notify()

Eksempel på Producent-Konsument public class ProducentKonsument extends Thread private List kø = new ArrayList(); /** Læg en opgave i kø til en arbejdstråd */ public static void main(string[] args) throws E public void lægikø(string tekst) ProducentKonsument producentkonsument; synchronized (kø) producentkonsument = new ProducentKonsument() kø.add(tekst); producentkonsument.start(); System.out.println("Sat i kø: " + tekst); for (int i = 0; i < 5; i++) kø.notify(); producentkonsument.lægikø("tal " + i); public void run() while (true) try synchronized (kø) while (!kø.isempty()) //String s = (String) kø.remove(kø.size() - 1); String s = (String) kø.remove(0); Thread.sleep(450); System.out.println("Konsumeret: " + s); kø.wait(); catch (InterruptedException ie) System.err.println("afbrudt"); Thread.sleep(100); for (int i = 0; i < 5; i++) producentkonsument.lægikø("talb " + i);

Designmønstret Trådpulje Problem: Mange opgave skal udføres. Det er for resursekrævende at oprette en ny tråd per opgave. Løsning: Lad en Objektpulje varetage og genbruge trådene. Lad klienter få opgaverne udført ved at sætte dem i kø i trådpuljen. Mange forskellige implementationer i java.util.concurrent F.eks. ThreadPoolExecutor http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/threadpoolex Kun i JDK 1.5 Eksempel på implementation på de følgende sider Afsnit 16.7.2: Genbrug af tråde

Designmønstret Trådpulje import java.util.*; public class Traadpulje private List ledige = new ArrayList(); // Listen over ledige arbejdstråde /** Læg en opgave i kø til en arbejdstråd */ public synchronized void startopgave(runnable opgave) Arbejder a; if (ledige.isempty()) a = new Arbejder(); // ingen arbejdstråde ledige, en ny oprettes a.setdaemon(true); // tillad systemet at lukke ned selvom tråden er aktiv System.out.println("Ny arbejdstråd oprettet."); a.start(); else synchronized(ledige) a = (Arbejder) ledige.remove(ledige.size()-1);// tag arbejdstråd fra liste synchronized(a) if (a.opgave!= null) throw new InternalError("Tråden kører allerede"); a.opgave = opgave; a.notify(); // væk arbejdstråden der venter i wait()

Designmønstret Trådpulje /** * Arbejds-tråden. * Den er stærkt bundet til puljen så den er lagt som en privat indre klasse. */ private class Arbejder extends Thread private Runnable opgave = null; public final synchronized void run() while (true) try if (opgave!= null) System.out.println(this+" virker nu på "+opgave); opgave.run(); // udfør opgaven opgave = null; //... og glem den (!) synchronized(ledige) ledige.add(this); // læg tråd tilbage i listen System.out.println(this+" venter på opgave."); this.wait(); // vent på at blive vækket med notify() catch (Exception e) System.err.println(this+": Fejl opstod i opgave "+opgave); e.printstacktrace(); // slut på run() // slut på den indre klasse Arbejder

JDK 1.5: java.util.concurrent Pakken java.util.concurrent.atomic AtomicBoolean, AtomicInteger, AtomicReference,... Udelelige operationer (så man slipper for synchronized), a la int getandset(int newvalue) int addandget(int delta) int getanddecrement() boolean compareandset(int expect, int update) Pakken java.util.concurrent.locks ReentrantLock Reentrant (samme tråd kan låse flere gange) ReentrantReadWriteLock Læse og skrivelås (flere kan godt læse samtidig) Nedgradere fra skrivelås til læselås muligt Pakken java.util.concurrent ConcurrentHashMap, CopyOnWriteArrayList,... Køer til variationer af Producent Konsument designmønstret ArrayBlockingQueue, DelayQueue, PriorityBlockingQueue, SynchronousQueue Trådpuljer ThreadPoolExecutor, ScheduledThreadPoolExecutor

Flertrådede grafiske programmer Swing og AWT er ikke trådsikre!!! Forestil dig at de var: Så skulle hver eneste set metode være synkroniseret!! => hurtigere, mindre kode, nemmere at fejlfinde etc Grafiske brugergrænseflader er sjældent flertrådede => kun GUI tråden (Event Dispatching Thread) må bruges! Kun denne tråd må kalde metoder i og ændre i grafiske komponenter! Dog må revalidate() og repaint() kaldes fra enhver tråd Ofte, men ikke altid, går det godt alligevel selvom en anden tråd kalder

Flertrådede grafiske programmer Hvordan få et foretaget fra GUI tråden? Man kan lave et Runnable objekt og få det udføret fra GUI tråd SwingUtilities.invokeLater( Runnable r ) SwingUtilities.invokeAndWait( Runnable r ) Større opgaver/beregninger Brug SwingWorker klassen Sværere at forstå Ikke del af standardbiblioteket Gentagne hændelser javax.swing.timer får GUI tråden til at kalde actionperformed() på objekt

Afprøvning (test) Vigtigt hvis man ønsker programmer af høj kvalitet Formål: At finde (logiske) fejl Psykologisk modstrid Jo tidligere fejl findes, desto lettere (og dermed billigere) er det at finde dem. Afprøvning bør foregå på alle stadier af udviklingsprocessen. Unit testing: Hver enhed (klasse) afprøves uafhængigt før enhederne integreres i hele systemet. Integrations og systemtest: Afprøve delene og hele systemet samlet. Accepttest/slutbrugertest: Sikrer at sytemet opfører sig som forventet af brugeren.

Afprøvningsstrategier Blackbox testing Afprøvning af delens grænseflade til resten af systemet. Whitebox testing Afprøvning sker i forhold til at man ved hvordan delens er implementeret (den indre logik og kodestruktur).

Blackbox Testing Ækvivalensinddeling: Mængden af det mulige input inddeles i ækvivalensklasser. Grænseværdier bør afprøves. Mængden af det mulige input bør indeholde både gyldigt og ugyldige input. Positiv afprøvning: Testtilfælde som forventes at gå godt. Negativ afprøvning: Testtilfælde som forventes at gå galt. JUnit Et system til Unit testing (Blackbox afprøvning af klasser). Regressionstest Tidligere test som er gået godt bør gentages hver gang der er foretaget ændringer i klassen.

JUnit i praksis De fleste udviklingsværktøjer har JUnit indbygget JBuilder demo BlueJ Kan interaktivt optage afprøvningseksempler demo