Praktische Informatik 1

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Ein Beispiel in Java.
Prof. Dr.-Ing. habil. B. Steinbach - Informatik / Softwaretechnologie und Programmierungstechnik - Institut für Informatik Verteilte Software - Java -
Verteilte Software - Java - Prozedurale Programmierung 1
Grundlagen der Programmierung (GP) Prof. Dr. H. Schlingloff Joachim Hänsel
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Programmierung grafischer Oberflächen
Threads Richard Göbel.
Java: Programmierung grafischer Oberflächen
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
Ein Beispiel in Java.
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
Sommersemester 2003 Lars Bernard
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 7 User Interfaces in Java Sommersemester 2003 Lars Bernard.
AWT – Detailbetrachtung Java 3D – Seminar im Wintersemester 2002/2003 Christian Schneider.
Institut für Kartographie und Geoinformation Prof.-Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk Dörschlag Einführung in die Programmierung mit.
Java-Kurs Grafik Julian Drerup.
Programmieren mit JAVA
1DVG3 - Eventbehandlung Eventbehandlung. DVG3 - Eventbehandlung 2 Events Events sind externe Ereignisse, die parallel zum normalen Programmablauf auftreten.
DVG3 - Bilder IMAGES (Bilder) Vortrag : Ronny Kuhnert am 9. November 1999.
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
DVG1 - Applets1 Applets. DVG1 - Applets2 Die Klasse Applet n Applets sind Grafikobjekte, die unter Steuerung eines anderen Programms (z.B. eines Browsers,
1DVG3 - anonyme Klassen Anonyme Klassen. DVG3 - anonyme Klassen 2 Syntax new BasisKlasse(Parameterliste) { Modifikationen und Erweiterungen der Basisklasse.
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
03 - Paint Das Zeichenprogramm EMMA Paint2 Aufgabenstellung Entwicklung eines ausschließlich in JAVA programmierten Graphikprogrammes. Vergleichsprodukte:
Java in 9 Folien Besser: Online-Buch Go to Java 2.
© 2002 Dr. Cavelius - Ley - Pohlig - Taulien Step by step zum JFrame 1 Zum JFrame Step by step by step by step by step by step by step by step by.
© 2005 Pohlig GK Informatik K Zum JFrame Step by step by step by step by step by step by step by step by.
© 2006 MPohlig Grundkurs Informatik mit Java 1 JFrame-Vorlage Step by step by step by step by step by step by step by step by.
© 2004 Pohlig - Taulien Swing Ereignissteuerung. © 2004 Pohlig - Taulien GK Informatik mit Java 2 Auf Button-Klick reagieren.
FH-Hof Java2D - Grundlagen Richard Göbel. FH-Hof Java2D - Funktionen Java2D unterstützt: das Zeichnen von Grafiken die Darstellung von Texten die Darstellung.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Sommersemester 2004 Jan Drewnak Entwicklung und Einsatz von Geosoftware I Praktikum Sitzung 7 Sitzung 7: User Interfaces in Java.
Objektorientierte Modellierung
Erste Schritte mit Eclipse Neues Projekt erstellen (1)
AWT und JFC Abstract Windowing Toolkit
Applets Java für’s Web.
Java: Programmierung grafischer Oberflächen
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
Programmierpraktikum Java SS 2005
CuP - Java Achzehnte (und LETZTE. ) Vorlesung : 1
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
© 2005 Pohlig Informatik Jg. 11 mfH Michael Pohlig 1 Zum JFrame Step by step by step by step by step by step by step by step by.
Java-Kurs Übung Benutzeroberflächen und Graphik Frames (Fenster)
Threads in Java Threads  Sprachumfang von Java Der Java-Standard fordert nur die Unterstützung von Thread-Prioritäten. Es gibt keine Forderung bzgl.:
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
Einführung in die OOP in Java
1 VE 11 Kruskal-Realisierung Listen. 2 Auf dem Weg zur Kruskal-Realisierung Vorüberlegungen: Der Graph könnte dargestellt werden als Menge von Knoten,
GUI Programmierung in Java Branimir Djordjevic. GUI - Wichtige Begriffe -  Die Swing-Bibliothek in Java stellt zum Beispiel die folgenden Windows zur.
Java Programme nur ein bisschen objektorientiert.
, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, WS 2005/06 Event Handling in der Programmiersprache Java.
Grafische Benutzeroberflächen mit Swing (2) Christoph Broschinski, Alexander Sczyrba Jan Krüger
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
Wie überwacht man Objekte im "Alltag" ?
Abstract Windowing Toolkit
Abstract Windowing Toolkit
Praktische Informatik 1
Objektorientierung Gliederung von Daten und Funktionen zu Objekten
Vererbung.
JAVA lernen: Methoden.
Der kritische Abschnitt
Java-Kurs Übung Grafik in Java - das Abstract Windowing Toolkit
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
Mit der Turtle Java Programmieren
Kurs: Programmieren in Java Tag 5
Raphael Fischer Informatik II - Übung 06 Raphael Fischer
Informatik Kurse
«Delegierter» Methoden Schablone Funktionszeiger
Implementieren von Klassen
 Präsentation transkript:

Praktische Informatik 1 Prof. Dr. H. Schlingloff 23. 1. 2008

Synchronisationsproblem class TicTac implements Runnable{ static int summe = 0; Thread faden; private int wer; public TicTac(int w) { faden = new Thread(this); wer=w;} public void run() { if(wer==1) summe++; else summe--; } } public static void main(String[] args) { TicTac tic = new TicTac(1); TicTac tac = new TicTac(2); tic.faden.start(); tac.faden.start(); ... } package Parallelität; class TicTac implements Runnable{ static int summe = 0; Thread faden; private int wer; public TicTac(int w) { faden = new Thread(this); wer=w; } public void run() { System.out.println("Prozess "+ wer + " gestartet"); for(int i=1;i<10000000;i++) { if(wer==1) summe++; else summe--; System.out.println("Prozess "+ wer + " beendet"); public static void main(String[] args) { TicTac tic = new TicTac(1); TicTac tac = new TicTac(2); tic.faden.start(); tac.faden.start(); System.out.println("alles gestartet!"); try {tic.faden.join(); tac.faden.join();} catch (Exception e) {} System.out.println("Summe=" + summe);

Interleaving

Monitor class Monitor { private int i = 0; synchronized void inc() { i++;} synchronized void dec() { i--;} int val() { return i; } } class TicTac implements Runnable{ static Monitor summe = new Monitor(); ... public void run() { if(wer==1) summe.inc(); else summe.dec(); } } package Parallelität; class Monitor { private int i = 0; synchronized void inc() { i++;} synchronized void dec() { i--;} int val() { return i; } } class TicTac implements Runnable{ static Monitor summe = new Monitor(); Thread faden; private int wer; public TicTac(int w) { faden = new Thread(this); wer=w;} public void run() { System.out.println("Prozess "+ wer + " gestartet"); for(int i=1;i<10000000;i++) { if (i%1000000==0) { System.out.println("T"+((wer==1)?"i":"a")+"c's i = " + i/1000000); if(wer==1) summe.inc(); else summe.dec(); System.out.println("Prozess "+ wer + " beendet"); public static void main(String[] args) { TicTac tic = new TicTac(1); TicTac tac = new TicTac(2); tic.faden.start(); tac.faden.start(); try {tic.faden.join(); tac.faden.join();} catch (Exception e) {} System.out.println("Summe=" + summe.val());

synchronisierte Methoden für jedes Objekt gibt es ein intrinsisches Schloss, welches den Zugang einschränkt während des Ablaufs einer synchronisierten Methode wird das Schloss verschlossen daher kann keine andere synchronisierte Methode dieses Objekts gleichzeitig ablaufen diese muss ggf. warten (Gefahr der Verklemmung (deadlock)!)

Synchronisationsanweisung class Mutex {}; class TicTac implements Runnable{ static Mutex m = new Mutex(); ... public void run() { for(int i=1;i<10000000;i++) { synchronized(m) { if(wer==1) summe++; else summe--; } package Parallelität; class Monitor { private int i = 0; synchronized void inc() { i++;} synchronized void dec() { i--;} int val() { return i; } } class TicTac implements Runnable{ static Monitor summe = new Monitor(); Thread faden; private int wer; public TicTac(int w) { faden = new Thread(this); wer=w;} public void run() { System.out.println("Prozess "+ wer + " gestartet"); for(int i=1;i<10000000;i++) { if (i%1000000==0) { System.out.println("T"+((wer==1)?"i":"a")+"c's i = " + i/1000000); if(wer==1) summe.inc(); else summe.dec(); System.out.println("Prozess "+ wer + " beendet"); public static void main(String[] args) { TicTac tic = new TicTac(1); TicTac tac = new TicTac(2); tic.faden.start(); tac.faden.start(); try {tic.faden.join(); tac.faden.join();} catch (Exception e) {} System.out.println("Summe=" + summe.val()); gleicher Effekt wie mit Monitor

E.W.Dijkstra: Dinierende Philosophen 5 Philosophen, eine Schüssel Spaghetti Zyklus: denken – essen – denken – ... Jeder benötigt zwei Gabeln zum Essen

ein einfacher Algorithmus Jeder Philosoph macht folgendes: wiederhole: denke warte, bis linke Gabel frei, dann nimm sie warte, bis rechte Gabel frei, dann nimm sie iss gib beide Gabeln wieder frei verklemmungsbedroht! Implementierung siehe z.B. http://www.doc.ic.ac.uk/~jnm/concurrency/classes/Diners/Diners.html

etwas besserer Algorithmus Jeder Philosoph macht folgendes: wiederhole: denke wiederhole solange bis beide Gabeln genommen wurden: warte, bis linke Gabel frei, dann nimm sie falls rechte Gabel nicht da, gib linke wieder frei warte, bis rechte Gabel frei, dann nimm sie falls linke Gabel nicht da, gib rechte wieder frei iss gib beide Gabeln wieder frei sinnlose Beschäftigung (livelock)!

noch besserer Algorithmus Jeder Philosoph macht folgendes: wiederhole: denke warte, bis beide Gabeln frei, dann nimm sie iss gib beide Gabeln wieder frei (und teile dies den Nachbarn mit) Aufnehmen der Gabeln exklusiv (mutex) Aushungerungsmöglichkeit!

pragmatische Lösungsmöglichkeiten Vor dem Aufnehmen der Gabel(n) eine zufällig bestimmte Zeitdauer warten (keine garantierte Fehlerfreiheit, wird aber in Kommunikationsprotokollen so gelöst) Unabhängiger Deadlock-Erkennungsalgorithmus („Wachhund“) Symmetriebruch oder feste Reihenfolgen Wartenummernverfahren

Kapitel 8: Java-Programmierung 8.1 Ereignisbehandlung, Benutzungsschnittstellen 8.2 Graphikprogrammierung 8.3 Applets, Internetprogrammierung

8.1 Ereignisbehandlung Benutzerinteraktion per Konsolschnittstelle Programm wartet bis Benutzer „return“ eingibt Benutzerinteraktion per GUI (graphical user interface) Viele verschiedene Eingabemöglichkeiten, Ereignisse ablaufgesteuerte Programmierung: Programm = Folge von Anweisungen (= Methodenaufrufen) ereignisgesteuerte Programmierung: Programm = Sammlung von Behandlungsroutinen (= Methoden) für verschiedene Ereignisse

Ereignisse (events) Mausklick, Mausziehen, Mausbewegung, Return-Taste, Tastatureingabe, … Signale des Zeitgebers, Unterbrechungen, … programmerzeugte Ereignisse Für jedes Fenster wird ein Prozess gestartet, der auf die Ereignisse wartet und sie bearbeitet. Methoden zur Beobachtung von bestimmter Ereignisse; explizite Anmeldung der Beobachter

AWT und Swing zwei weit verbreitete Bibliotheken zur Realisierung von GUIs AWT (Abstract Window Toolkit): plattformunabhängige schwergewichtige Bibliothek (BS-Routinen) Swing: Bestandteil der Java-Runtime (leichtgewichtig); spezifisches Look-and-Feel, zusätzliche Komponenten, etwas moderner.

Fenster import java.awt.*; class Fenster extends Frame { Fenster (String titel) { super(titel); setSize(160,120); setVisible(true); } } public class FensterDemo { public static void main(String[] args) { Fenster zumHof = new Fenster("zum Hof"); Fenster zurTür = new Fenster("zur Tür"); import java.awt.*; class Fenster extends Frame { Fenster (String titel) { super(titel); setSize(160,120); setVisible(true); } } public class FensterDemo { public static void main(String[] args) { Fenster zumHof = new Fenster("zum Hof"); Fenster zurTür = new Fenster("zur Tür");

Fensterbeobachter import java.awt.event.*; class FensterBeobachter extends WindowAdapter{ public void windowClosing(WindowEvent e) { System.exit(0); } class Fenster extends Frame { Fenster (String titel) { ... FensterBeobachter fb = new FensterBeobachter(); addWindowListener(fb); package GUIAWT; import java.awt.*; import java.awt.event.*; class FensterBeobachter extends WindowAdapter{ public void windowClosing(WindowEvent e) { System.exit(0); } } class Fenster extends Frame { Fenster (String titel) { super(titel); FensterBeobachter fb = new FensterBeobachter(); addWindowListener(fb); setSize(240,180); setVisible(true); public class FensterDemo { public static void main(String[] args) { Fenster f = new Fenster("PI-1"); Analogie: Thread faden = new Thread(this); ... tic.faden.start();

Knöpfe und Knopfbeobachter class KnopfBeobachter implements ActionListener{ public void actionPerformed(ActionEvent e) { System.out.println("Knopf gedrückt!"); } } class Fenster extends Frame { Fenster (String titel) { ... Button knopf = new Button("Knopf!"); knopf.addActionListener(new KnopfBeobachter()); add(knopf); package GUIAWT; import java.awt.*; import java.awt.event.*; class FensterBeobachter extends WindowAdapter{ public void windowClosing(WindowEvent e) { System.exit(0); } } class KnopfBeobachter implements ActionListener{ public void actionPerformed(ActionEvent e) { System.out.println("Knopf gedrückt!"); } class Fenster extends Frame { Fenster (String titel) { super(titel); addWindowListener(new FensterBeobachter()); setSize(240,180); setVisible(true); Button knopf = new Button("Knopf!"); knopf.addActionListener(new KnopfBeobachter()); add(knopf); public class FensterDemo { public static void main(String[] args) { Fenster f = new Fenster("PI-1");

aktive Komponenten Zur Verwendung aktiver Komponenten (Knöpfe, Schalter, …) sind immer folgende Schritte nötig Erzeugen – Button b = new Button () Registrieren – add(b) Verbinden zur Ereignisbehandlung – add....Listener(this) Methode zur Ereignisbehandlung schreiben actionPerformed, itemStateChanged, adjustmentValueChanged,...

anonyme Beobachter class Fenster extends Frame { Fenster (String titel) { ... Button knopf2 = new Button("Knopf2"); knopf2.addActionListener (new ActionListener (){ public void actionPerformed(ActionEvent e) { System.out.println("Knopf2 gedrückt!"); }}); add(knopf2); package GUIAWT; import java.awt.*; import java.awt.event.*; class FensterBeobachter extends WindowAdapter{ public void windowClosing(WindowEvent e) { System.exit(0); } } class KnopfBeobachter implements ActionListener{ public void actionPerformed(ActionEvent e) { System.out.println("Knopf gedrückt!"); } class Fenster extends Frame { Fenster (String titel) { super(titel); addWindowListener(new FensterBeobachter()); setSize(240,180); setVisible(true); Button knopf = new Button("Knopf!"); knopf.addActionListener(new KnopfBeobachter()); add(knopf); setLayout(new FlowLayout()); Button knopf2 = new Button("Knopf2"); knopf2.addActionListener (new ActionListener (){ System.out.println("Knopf2 gedrückt!"); }}); add(knopf2); public class FensterDemo { public static void main(String[] args) { Fenster f = new Fenster("PI-1");

Layout-Fragen mehrere verschiedene Layouts verfügbar! BorderLayout class Fenster extends Frame { Fenster (String titel) { ... setLayout(new FlowLayout()); Button knopf2 = ... mehrere verschiedene Layouts verfügbar! BorderLayout FlowLayout GridLayout CardLayout GridBagLayout Schachtelung von Layouts möglich package GUIAWT; import java.awt.*; import java.awt.event.*; class FensterBeobachter extends WindowAdapter{ public void windowClosing(WindowEvent e) { System.exit(0); } } class KnopfBeobachter implements ActionListener{ public void actionPerformed(ActionEvent e) { System.out.println("Knopf gedrückt!"); } class Fenster extends Frame { Fenster (String titel) { super(titel); addWindowListener(new FensterBeobachter()); setSize(240,180); setVisible(true); Button knopf = new Button("Knopf!"); knopf.addActionListener(new KnopfBeobachter()); add(knopf); setLayout(new FlowLayout()); Button knopf2 = new Button("Knopf2"); knopf2.addActionListener (new ActionListener (){ System.out.println("Knopf2 gedrückt!"); }}); add(knopf2); public class FensterDemo { public static void main(String[] args) { Fenster f = new Fenster("PI-1");

8.2 Graphikprogrammierung Mausevents werden nach dem selben Schema behandelt Ausgabe graphischer Elemente (Linien, Kreise, Vielecke, Polygone…) mit Objekt der Klasse Graphics Methoden: drawLine, fillPolygon, drawOval, … Konstruktor getGraphics() addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); } ...

ein Malprogramm ... addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); } public void mouseReleased(MouseEvent e) { x2 = e.getX(); y2 = e.getY(); Graphics g = getGraphics(); g.setColor(Color.blue); int w=Math.abs(x1-x2), h=Math.abs(y1-y2); switch (modus) { case 1: g.fillRect(x1,y1,w,h); break; case 2: g.fillOval(x1,y1,w,h); break; } } }); package Grafik; import java.awt.*; import java.awt.event.*; class GrafikFenster extends Frame{ private static int x1, y1, x2, y2; private static int modus = 0; GrafikFenster(String titel, int breite, int höhe){ super(titel); setLayout(new FlowLayout()); Button RechteckButton = new Button ("Rechteck"); RechteckButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { modus = 1; } }); add(RechteckButton); Button OvalButton = new Button ("Oval"); OvalButton.addActionListener(new ActionListener() { modus = 2; } }); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); } public void mouseReleased(MouseEvent e) { x2 = e.getX(); y2 = e.getY(); Graphics g = getGraphics(); g.setColor(Color.blue); int w=Math.abs(x1-x2), h=Math.abs(y1-y2); switch (modus) { case 1: g.fillRect(x1,y1,w,h); break; case 2: g.fillOval(x1,y1,w,h); break; default: break; }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); } setBackground(Color.lightGray); setSize(breite, höhe); setVisible(true); public class GrafikDemo { public static void main(String[] args) { GrafikFenster f = new GrafikFenster("Künstler",800,600);

Animationen Bei Veränderung des Fensters (z.B. Vergrößern) geht die Zeichnung verloren paint (Graphics g) zur Ausgabe der Zeichnung, wird bei Fensterveränderungen automatisch aufgerufen paint muss so programmiert werden, dass es alle Zeichnungsobjekte ausgibt Eintrag von Zeichnungsobjekten in Collection (z.B. Set), iterative Ausgabe aller Elemente Die selbe Methode kann für Animationen benutzt werden Aufruf von paint() in eigenem Thread, alle 40 ms add(new Checkbox("check!"));