Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

1

Monday, August 19th 2002, 7:26pm

Fragen zu Programmieren II

Hallo!!!
Ich beschäftige mich z.Z. mit den Threads und deswegen habe ich mir die Klasse Caller aus der Vorlesung näher angeschaut. Die Funktionsweise oder die Absicht des Programms habe ich meiner Meinung nach verstanden. Es bleiben nur kleine Fragen am Rande, die ich hier stellen möchte.
Erstens, es ist für mich nicht ganz klar, warum die Ausgabe für kleinere Argumente nicht erfolgt. Z.B. funktioniert der Aufruf java Caller 3 100000 einwandfrei und man erhält eine ähnliche Ausgabe wie auf der Folie. Sobald der zweite Argument kleiner als 100000 ist, gibt es gar keine Ausgabe. Warum ist das so?
Zweitens, man möchte erreichen, dass die Threads "korrekt" arbeiten. Dafür synchronisieren wir kritische Stellen. Wie in der Folie beschrieben ist, gibt es zwei Möglichkeiten, entweder die Methode oder die Objektvariable, die uns kritisch erscheint, zu synchronisieren. Erste Möglichkeit führt bei mir nur zu einem bedingten Erfolg. D.h., dass einige Zahlen trotzdem nicht in der richtigen Reihenfolge erscheinen. Warum? (Das erste Problem besteht immer noch). Die zweite Möglichkeit führt gar zu keinem Erfolg, das Program hängt sich auf, was offensichtlich an der while Schleife in der main Methode liegt, kommentiert man sie aus, gibt es wieder keine Ausgabe. Warum?
Ich hoffe, dass ich meine Fragen hier verständlich darstellen konnte und hoffe auch auf eine kompetente Antwort.
mfg
MAX

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

2

Monday, August 19th 2002, 8:18pm

Quoted

Original von MAX
Erstens, es ist für mich nicht ganz klar, warum die Ausgabe für kleinere Argumente nicht erfolgt. Z.B. funktioniert der Aufruf java Caller 3 100000 einwandfrei und man erhält eine ähnliche Ausgabe wie auf der Folie. Sobald der zweite Argument kleiner als 100000 ist, gibt es gar keine Ausgabe. Warum ist das so?
Da die Wahrscheinlichkeit für Fehler, die aus der nicht vorhandenen Synchronisierung resultieren, bei kürzerer Laufzeit des Programms unwahrscheinlicher ist, passieren diese Fehler bei kleinen Werten für das zweite Argument natürlich seltener. Wenn du das Programm allerdings ein paar Mal z. B. mit den Parametern 3 und 10000 aufrufst, wirst du feststellen, daß auch dann eine Ausgabe zu sehen ist, also Fehler auftreten.

Quoted

Zweitens, man möchte erreichen, dass die Threads "korrekt" arbeiten. Dafür synchronisieren wir kritische Stellen. Wie in der Folie beschrieben ist, gibt es zwei Möglichkeiten, entweder die Methode oder die Objektvariable, die uns kritisch erscheint, zu synchronisieren. Erste Möglichkeit führt bei mir nur zu einem bedingten Erfolg. D.h., dass einige Zahlen trotzdem nicht in der richtigen Reihenfolge erscheinen. Warum?
Ist denke ich ein Fehler im Skript. Die Methode call() müßte folgendermaßen ausehen:

Source code

1
2
3
4
synchronized static private void call() {
    globalCallCount++;
    memory.add(new Integer(globalCallCount));
}

(Man beachte das "static"!)

Ohne static hat jeder Thread eine eigene Instanzenmethode call(), die er im Prinzip nur für sich selbst synchronisiert. Mit static wird call() zu einer Klassenmethode, die nur einmal im Speicher liegt, Sperrungen gelten somit für alle Threads.

Quoted

Die zweite Möglichkeit führt gar zu keinem Erfolg, das Program hängt sich auf, was offensichtlich an der while Schleife in der main Methode liegt, kommentiert man sie aus, gibt es wieder keine Ausgabe. Warum?
Die zweite Möglichkeit funktioniert bei mir genau so wie im Skript auf Folie 774 beschrieben. Wahrscheinlich hast du einen Fehler in deinem Code. Kannst ja mal ein paar Ausschnitte posten.

Zur while-Schleife: Die darf man aber nicht weglassen, da die ja gerade dafür sorgt, daß test() erst ausgeführt wird, wenn die anderen Threads mit dem Befüllen des Vektors fertig sind. Findet der Test also vorher statt, ist die Wahrscheinlichkeit für Fehler, also auch für die Ausgabe, natürlich viel geringer ...
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

3

Monday, August 19th 2002, 8:40pm

ok

Das erste Problem ist jetzt klar geworden. Ich hatte etwas anderes zuvor gedacht. Bei dem Problem 2a (ich mache also call() Methode zu static) kommt das Programm nicht zum Ende (Aufhänger). Beim Problem 2b habe ich auch genauso, wie im Script gemacht, also die Methode abgeschrieben. Trotzdem ein Aufhänger. Hier ist ein ausschnitt:

Source code

1
2
3
4
5
6
7
8
9
10
private
    void
    call()
    {
    	synchronized(memory)
    	{
    		globalCallCount++;
        	memory.add(new Integer(globalCallCount));
        }
    }


Kann es sein, dass ich zuviele Prozesse im Hintergrund laufen lasse, d.h. ich sollte einfach länger warten???

Zur while Schleife: Es ist mir klar, dass man sie nicht einfach so weglassen kann, aber vielleicht ist sie nicht so gut auf das Programm abgestimmt worden. Das heißt, man sollte lieber eine andere while Schleife benutzen. Wie sie aussehen soll, habe ich keine Ahnung.
mfg
MAX

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

4

Monday, August 19th 2002, 9:12pm

Quoted

Original von MAX
Das erste Problem ist jetzt klar geworden. Ich hatte etwas anderes zuvor gedacht. Bei dem Problem 2a (ich mache also call() Methode zu static) kommt das Programm nicht zum Ende (Aufhänger).
Sollte eigentlich nicht passieren. Probier' mal kleinere Werte für den zweiten Parameter aus (so klein, daß das Programm zum Ende kommt) und erhöhe diesen dann schrittweise. Wahrscheinlich mußt du einfach nur länger warten.

Quoted

Beim Problem 2b habe ich auch genauso, wie im Script gemacht, also die Methode abgeschrieben. Trotzdem ein Aufhänger. Hier ist ein ausschnitt:

[...]
Sieht richtig aus. Kontrolliere mal deinen kompletten Code - ist der auch wirklich identisch mit dem unter http://www-a2.informatik.uni-hannover.de…lltexte/Caller/? (mit Ausnahme der synchronized-Änderung natürlich)

Quoted

Zur while Schleife: Es ist mir klar, dass man sie nicht einfach so weglassen kann, aber vielleicht ist sie nicht so gut auf das Programm abgestimmt worden. Das heißt, man sollte lieber eine andere while Schleife benutzen. Wie sie aussehen soll, habe ich keine Ahnung.
Die while-Schleife ist IMHO vollkommen in Ordnung. Das Problem liegt mit Sicherheit woanders.

PS: Was für einen Rechner hast du eigentlich?
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

5

Monday, August 19th 2002, 9:19pm

Jetz gehts!!!

Ich habe die ganze Geschichte nochmal unter Linux ausprobiert und es funktioniert tatsächlich alles wie es sein sollte.
Wenn ich nur die Methode call() synchronisiere, sie aber nicht statisch mache, dann kommt das Programm nicht zum Ende. Nachdem ich sie statisch gemacht habe, funktioniert alles einwandfrei. Wenn ich nur die Objektvariable synchronisiere und dabei die call() Methode auch statisch mache, funktioniert auch alles wunderbar. Du lagst also mit deiner Vermutung richtig, dass man Methode statisch deklarieren muss. Es ist auch eigentlich klar und offensichtlich.

Ich muss aber noch was zu diesem Programm sagen. Ich finde dieses Beispiel keine gute Einführung für Multithreading, denn hier sieht man leider nicht so gut, was Multithreading ist und wie es arbeitet. Ich denke, dass ich ohne zusätzliche Literatur nur an diesem Beispiel gar nicht verstanden hätte, wie Multithreading funktioniert. Vielleicht war das auch die Absicht des Autors, dass wir zu anderen Quellen greifen, um das zu verstehen. Wie gesagt, das hier ist nur meine persönliche Meinung und sollte nicht überbewertet werden.
mfg
MAX

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

6

Monday, August 19th 2002, 9:31pm

Quoted

Original von MAX
Wenn ich nur die Methode call() synchronisiere, sie aber nicht statisch mache, dann kommt das Programm nicht zum Ende.
Das sollte eigentlich nicht passieren. Auch ohne funktionierende Synchronisierung sollte das Programm zum Ende kommen -- dann sollten jedoch in der Regel Synchronisierungsfehler auftauchen.

Quoted

Nachdem ich sie statisch gemacht habe, funktioniert alles einwandfrei.
So soll es sein.

Quoted

Wenn ich nur die Objektvariable synchronisiere und dabei die call() Methode auch statisch mache, funktioniert auch alles wunderbar.
Die Methode call() muß dann aber nicht static sein. Es sollte auch so funktionieren. Irgendwas läuft bei dir gewaltig schief. Kontrolliere doch bitte nochmal deinen *kompletten* Quellcode (oder stelle ihn irgendwo zum Download, damit wir ihn uns mal anschauen können).

Quoted

Ich muss aber noch was zu diesem Programm sagen. Ich finde dieses Beispiel keine gute Einführung für Multithreading, denn hier sieht man leider nicht so gut, was Multithreading ist und wie es arbeitet.
Das Beispiel sollte ja auch die *Probleme* von unsynchronisiertem Multithreading veranschaulichen und kein Beispiel für Multithreading an sich sein. Und dafür wird man kaum ein "minimaleres" Beispiel finden.

Quoted

Ich denke, dass ich ohne zusätzliche Literatur nur an diesem Beispiel gar nicht verstanden hätte, wie Multithreading funktioniert. Vielleicht war das auch die Absicht des Autors, dass wir zu anderen Quellen greifen, um das zu verstehen.
Das sagt tby ja schon seit der ersten Vorlesung. Und damit hat er IMHO vollkommen recht. Die Vorlesung soll Einblicke geben und Stichworte liefern, um sich selber mit den Themen beschäftigen zu können. Ein umfassender Programmierkurs sollte (und konnte!) es ja nie sein.
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

7

Monday, August 19th 2002, 9:45pm

ist egal

Quoted

Die Methode call() muß dann aber nicht static sein. Es sollte auch so funktionieren. Irgendwas läuft bei dir gewaltig schief. Kontrolliere doch bitte nochmal deinen *kompletten* Quellcode (oder stelle ihn irgendwo zum Download, damit wir ihn uns mal anschauen können).

Ich denke nicht, dass es am Quellcode liegt. Ich habe ihn von der HP heruntergeladen und nur diese zwei Möglichkeiten ausprobiert. Also der Quellcode sollte bei mir genauso aussehen wie bei allen anderen. Was sehr auffällig ist, dass unter Windows das Programm sich etwas anderes verhält als unter Linux. Wie gesagt, Probleme tauchen mit großen Zahlen auf, d.h. sehr viele call() Aufrufe. Ich vermute, es laufen (oder besser liefen zum Zeitpunkt) sehr viele Prozesse im Hintergrund, so dass man länger warten müsste.

Quoted

Das Beispiel sollte ja auch die *Probleme* von unsynchronisiertem Multithreading veranschaulichen und kein Beispiel für Multithreading an sich sein. Und dafür wird man kaum ein "minimaleres" Beispiel finden.

Das ist aber schade, denn bevor ich Probleme einer Sache aufzeige, stelle ich zuerst das Problem ein Mal vor, und das hätte bestimmt mit einem kleinen Einführungsbeispiel gereicht. Aber ich möchte das hier nicht weiter ausführen. Für uns sind andere Sachen wichtiger.
mfg
MAX

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

8

Wednesday, August 28th 2002, 4:13pm

Noch eine Frage!!!

In dem Aufgabenblatt 7 steht, dass ein Thread nicht direkt gestopt werden kann.
Mit der Methode stop() kann aber ein Thread auch gestopt werden. Die Methode ist aber als deprecated erklärt. Trotzdem, ist das nicht ein direktes Stopen eines Threads???
mfg
MAX

migu

free rider

  • "migu" is male

Posts: 2,643

Date of registration: Dec 11th 2001

Occupation: Developer

9

Wednesday, August 28th 2002, 5:19pm

Quoted

Original von MAX
Mit der Methode stop() kann aber ein Thread auch gestopt werden. Die Methode ist aber als deprecated erklärt. Trotzdem, ist das nicht ein direktes Stopen eines Threads???


Wenn diese Methode deprecated ist, dann ist es sicherlich keine Option, sie zu verwenden. In der API-Doc steht dazu nämlich: "This method is inherently unsafe. Stopping a thread with..." (selbst weiter lesen ;-)

Okay, man könnte sie verwenden, doch ...
tar: Anlegen eines leeren Archivs wird feige verweigert.

BlaueMotte

Trainee

  • "BlaueMotte" is female

Posts: 76

Date of registration: Apr 9th 2002

Location: vom platten Land mit Nordseeluft

Occupation: hä? Studi...

10

Friday, August 30th 2002, 10:20am

API

Wie kann man in der API den ganzen Quelltext zu einer Klasse lesen?

Es wird ja immer nur kurz dargestellt, was eine Methode kann, aber woher bekomm ich die komplette Darstellung einer Klasse? So wie in der Vorlesung AbstactCollection?

MAX

Senior Schreiberling

  • "MAX" is male
  • "MAX" started this thread

Posts: 822

Date of registration: Dec 11th 2001

Location: Hannover

11

Friday, August 30th 2002, 11:00am

anders

In der API Beschreibung kannst du keinen Quelltext finden. Wenn du aber SDK installiert hast, dann liegen alle Queltexte im Verzeichnis z.B. in
C:\j2sdk1.4.0\src
Dort findest du andere Unterverzeichnisse (packages). U.a. auch java.lang oder natürlich alle anderen.
mfg
MAX

Tara

Junior Schreiberling

Posts: 131

Date of registration: Apr 21st 2002

12

Sunday, September 1st 2002, 7:49pm

Ich beschäftige mich grad mit Programmieren. Naja zumindest versuch ich es (nicht besonders erfolgreich aber immerhin ;) )
Zu meinen Fragen (ja es sind wieder FrageN)

1.) Ist die Wrapper-Klasse so eine Art Platzhalter?
2.)Der tatsächliche Typ eines Objektes bestimmt, welcher Methodenrumpf ausgeführt wird. Was ist damit gemeint? Also eigentlich versteh ich daran nur das Wort Methodenrumpf nicht
3.) Die tatsächlich aufgerufenen Methode kann also je nach Typ des Objektes variieren, auch wenn der Aufruf stehts gleich ist. ?( Hat da vielleicht wer ein bsp für? Ein ganz kurzes wenns geht. Muß ich mir ja auch merken können ;)
4.) Worin liegt der Unterschied zwischen deklariertem und tatsächlichem Typ?

Danke schonmal.

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

13

Monday, September 2nd 2002, 10:41am

Quoted

Original von Tara
1.) Ist die Wrapper-Klasse so eine Art Platzhalter?
Es gibt nicht nur eine Wrapper-Klasse. Mit Wrapper bezeichnet man eine ganze Gruppe von Klassen, nämlich solche, die einen bestehenden Datentyp "umhüllen" und eine neue Schnittstelle zu diesem anbieten.

In Java gibt es Wrapper-Klassen zu den primitiven Datentypen (ich vermute, diese meinst du eigentlich). Das hat z. B. den Vorteil, daß man in Datenstrukturen, in denen ein allgemeiner Speicherplatz vorgesehen ist (also vom Typ Object), auch primitive Datentypen speichern kann (wenn man denn die zugehörige Wrapper-Klasse benutzt).

Quoted

2.)Der tatsächliche Typ eines Objektes bestimmt, welcher Methodenrumpf ausgeführt wird. Was ist damit gemeint? Also eigentlich versteh ich daran nur das Wort Methodenrumpf nicht
Man könnte im Prinzip auch schreiben: "Der tatsächliche Typ eines Objektes bestimmt, welche Methode ausgeführt wird" (wenn man davon ausgeht, daß Methoden mit gleichem Namen, aber unterschiedlicher Signatur, etwas verschiedenes sind). Ein Methodenrumpf ist der Teil der Methode, in dem steht, "was gemacht wird". Siehe dazu auch die Folien 33 und 34 im Skript.

Quoted

3.) Die tatsächlich aufgerufenen Methode kann also je nach Typ des Objektes variieren, auch wenn der Aufruf stehts gleich ist. ?( Hat da vielleicht wer ein bsp für? Ein ganz kurzes wenns geht. Muß ich mir ja auch merken können ;)
Am besten, du schaust dir das Beispiel auf den Folien 196 bis 214 im Skript an. Oder besser: Programmiere es nach und probier' es aus. Das ist wahrscheinlich sinnvoller als hier das Prinzip lang und breit zu erklären. Falls du mit dem Beispiel Probleme haben solltest, kannst du dich ja nochmal melden.

Quoted

4.) Worin liegt der Unterschied zwischen deklariertem und tatsächlichem Typ?
Auch hier solltest du dich mit o. g. Folien im Skript beschäftigen.

Trotzdem ein kurzes Beispiel:

Source code

1
2
3
String objone = "Test";
Object objtwo = objone;
System.out.println(objtwo.toString());


Der deklarierte Typ von objtwo ist nun Object, der tatsächliche aber String.
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

cowhen

Muuuh!

  • "cowhen" is male

Posts: 1,374

Date of registration: Dec 13th 2001

14

Monday, September 2nd 2002, 10:59am

@tara

Quoted

2.)Der tatsächliche Typ eines Objektes bestimmt, welcher Methodenrumpf ausgeführt wird. Was ist damit gemeint? Also eigentlich versteh ich daran nur das Wort Methodenrumpf nicht
es geht eigentlich darum, dass du in java beliebig viele methoden mit gleichem namen definieren kannst. diese methoden müssen sich nur in ihrer signatur unterscheiden. d.h.:

Quoted

aus dem javabuch von g. krüger:
Unter der Signatur einer Methode versteht man ihren internen Namen. Dieser setzt sich aus dem nach außen sichtbaren Namen plus codierter Information über die Reihenfolge und Typen der formalen Parameter zusammen. Die Signaturen zweier gleichnamiger Methoden sind also immer dann unterscheidbar, wenn sie sich wenigstens in einem Parameter voneinander unterscheiden.


du kannst also eine methode test definieren, die als übergabe parameter einen int erwartet und eine methode test, die als übergabe parameter einen string erwartet. wenn du dann den aufruf test(5); schreibst wird automatisch die richtige methode aufgerufen.

genauso kannst du das auch mit den konstruktoren von klassen machen.
plenty of time to relax when you are dead

migu

free rider

  • "migu" is male

Posts: 2,643

Date of registration: Dec 11th 2001

Occupation: Developer

15

Monday, September 2nd 2002, 11:24am

Quoted

Original von Joachim
Trotzdem ein kurzes Beispiel:

Source code

1
2
3
String objone = "Test";
Object objtwo = objone;
System.out.println(objtwo.toString());


Der deklarierte Typ von objtwo ist nun Object, der tatsächliche aber String.


Der Fachbegriff, der diese Fähigkeit objektorientierter Sprachen beschreibt, lautet Polymorphismus.
String ist eine Subklasse von Object. Deshalb kann ein Instanz vom Typ Object Instanzen vom abgeleiteten Typ String aufnehmen.
Sehr praktisch ist dies, wenn man in einem Array viele Instanzen verschiedener Klassen, die von einer gemeinsamen Oberklasse abgeleitet sind, speichern will.

Beispiel:

class Obst {
boolean lecker;
}
class Apfel extends Obst {
float durchmesser;
public printName() { System.out.println("Apfel"); }
}
class Birne extends Obst {
float durchmesser;
public printName() { System.out.println("Birne"); }
}
class Banane extends Obst {
float dicke;
float laenge;
public printName() { System.out.println("Banane"); }
}

Obst[] fruechte = new Obst[2];
fruechte[0] = new Apfel();
fruechte[1] = new Birne();
fruechte[2] = new Banane();
for (int i=0; i < fruechte.length; i++) fruechte.printName();

...
tar: Anlegen eines leeren Archivs wird feige verweigert.

  • "chefstatist" is male

Posts: 57

Date of registration: Jan 9th 2002

Location: Hannover-Nordstadt

16

Monday, September 2nd 2002, 11:37am

Kurzreferenz & Hilfsmittel

Hallo,

welche Hilfsmittel sind in der Klausur eigentlich zugelassen? Darf man die Kurzreferenz wieder benutzen?

Grüße,

Fabian

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

17

Monday, September 2nd 2002, 11:40am

Quoted

Original von chefstatist
welche Hilfsmittel sind in der Klausur eigentlich zugelassen? Darf man die Kurzreferenz wieder benutzen?
Es sind keine Hilfsmittel zugelassen. Sollte es Aufgaben geben, zu denen man die API-Doc benötigt, werden wir laut Aussage von tby einen entsprechenden Ausschnitt aus derselben bekommen.
The purpose of computing is insight, not numbers.
Richard Hamming, 1962