![]() |
|
|||||||
| Netzwerkprogrammierung Fragen zu Client-/Server-Programmierung sowie zu verteilten Anwendungen (RMI, CORBA etc.) |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |||
|
Benutzer
int
Registriert seit: 02.11.2010
Fachbeiträge: 50
Abgegebene Danke: 8
Erhielt 0 Danke für 0 Beiträge
|
Hallo,
ich habe hier eine GWT-Anwendung, welche auf eine Datenbank via Hibernate zugreift. Für dem Datentransfer benutze ich RPCs. Ich möchte einen Datensatz aus einer Datenbank auslesen, und in eine Liste speichern und zurückgeben. Ich zeig euch mal den Code:
Wenn ich bei (1) die Größe zurückgeben lasse, ist dieses Ergebnis richtig wie erwartet. Bei (2) ist die Luste aber leer, weil die Methode ja parallel aufgerufen wird... Wie kann ich es so machen, dass gewartet wird, bis die Liste komplett gefuellt ist? |
||
|
|
|
| #2 (permalink) | |
|
Java-Forum Team
Moderator
Registriert seit: 13.11.2005
Fachbeiträge: 32.021
Abgegebene Danke: 0
Erhielt 2.623 Danke für 2.583 Beiträge
|
final Object monitor = new Object();
warten: monitor.wait(); aufwecken: monitor.notify(); am Ende der AsyncCallback-Aktioen, jeweils in synchronized-Blocks, die dir hoffentlich was sagen paar Gefahren gibt es, notify vor dem wait wäre schlecht, aber so schnell wird das wohl nicht ausgeführt, nicht ausgeführtes notify() wegen Exception wäre auch schlecht nicht ewig zu warten sondern nur bestimmte Zeiten und dann gegebenenfalls selber anders erscheinen wäre die etwas sichere Variante
__________________
Hansa wird Meister. |
|
|
|
| #3 (permalink) | |
|
Stammbenutzer
Viertel Gigabyte
Registriert seit: 12.07.2010
Fachbeiträge: 3.756
Abgegebene Danke: 159
Erhielt 441 Danke für 430 Beiträge
|
Indem on sucess wiederum ein event feuert, worauf deine Komponenten warten.
==> Du musst das also in die on success methode implementieren.
__________________
Wie man Fragen richtig stellt. Bei jedem Thread kommt nach einer völlig absurden Fehlerbeschreibung ein "habs gelöst" mit einer teils noch absurderen Lösung. (timbeau) |
|
|
|
| #4 (permalink) | ||||||||||||||||||
|
Benutzer
int
Themenstarter
Registriert seit: 02.11.2010
Fachbeiträge: 50
Abgegebene Danke: 8
Erhielt 0 Danke für 0 Beiträge
|
Also soll ich die wait() und notify() auf die Liste anwenden?
Ich weiss, was synchronized-Blöcke sind, habe sie jedoch noch nie benutzt... Habe es jetzt so testweise implementiert:
Was kommt in die Klammern von synchronized? Ich bekomme beim Starten der Anwendung folgende Fehler: Code:
[ERROR] Line 516: The method wait() is undefined for the type List<DataObjectDTO> [ERROR] Line 517: No source code is available for type java.lang.InterruptedException; did you forget to inherit a required module? [ERROR] Line 532: The method notify() is undefined for the type List<DataObjectDTO> Edith sagt:
Geändert von Fabulus (03.05.2012 um 10:58 Uhr) |
|||||||||||||||||
|
|
|
|||||||||||||||||
| #5 (permalink) | |
|
Java-Forum Team
Moderator
Registriert seit: 13.11.2005
Fachbeiträge: 32.021
Abgegebene Danke: 0
Erhielt 2.623 Danke für 2.583 Beiträge
|
das sind ja äußerst merkwürdige Fehlermeldungen für Methoden der Klasse Object, die nun wirklich jedes einzelne Java-Objekt haben sollte,
wenn diese nicht vorhanden sind, warum auch immer, sehe ich als Alternative nur noch Thread.sleep(), ist das erlaubt? sonst wäre Warten nicht gut hinzubekommen (von allen möglichen anderen Problemen, die so etwas merkwürdiges impliziert, abgesehen) ist es denkbar, dass die Methode nichts zurückgibt und onSuccess() stattdessen irgendwas aufruft? ------- unter Ignorierung der Fehlermeldungen noch weiter zu dem Thema, auch wenn vielleicht nicht zu verwenden: > Also soll ich die wait() und notify() auf die Liste anwenden? in zwei Hinsichten bemerkenswert, erstens habe ich doch geschrieben worauf du wait/ notify aufrufen sollst, ein neues Object monitor, eine vorhandene Liste zu nehmen ist allerdings durchaus eine bessere Alternative von dir, erstaunlich ist dann aber für mich, dass du nicht die lokale Variable objects nimmst sondern groups, welches im geposteten Code gar nicht weiter erklärt wird ---- in jedem Fall falsch wäre, das wait() VOR dem loadAllObjects() zu stellen, wenn DAVOR gewartet wird, dann kommt der AsyncCallback doch nie zur Arbeit, nie werden Listen geladen und vielleicht notify() aufgerufen usw., das wait() muss selbstverständlich dahinter, am Ende der Methode vor der Rückgabe erst das Taxi anrufen, dann an der Straße warten, nicht umgekehrt -------- edit: also mit Thread.sleep(Zeit x) in einer Schleife könntest du auf normaleren Wege warten, z.B. bis ein boolean von der Methode gesetzt wird (finale lokale boolean[]-Variable der Lönge 1) bei 'single-threaded' ist allerdings nicht zu erwarten, dass dann AsyncCallback überhaupt je drankommt, geht also wohl auch nicht..
__________________
Hansa wird Meister. Geändert von SlaterB (03.05.2012 um 11:01 Uhr) |
|
|
|
| #6 (permalink) | |||
|
Benutzer
int
Themenstarter
Registriert seit: 02.11.2010
Fachbeiträge: 50
Abgegebene Danke: 8
Erhielt 0 Danke für 0 Beiträge
|
groups war das gleiche Objekt, hab es nur umbenannt gehabt.
Das mit dem Taxi und dem wait klingt logisch, danke! Ich wollte es jetzt so versuchen:
Dies endet aber in einer Endlosschleife und das Skript bricht ab.. Was ich merkwürdig finde, ist, dass JavaScript das ganze Singlethreaded ausführt, aber die DB-Abfragen parallel laufen. Geändert von Fabulus (03.05.2012 um 11:17 Uhr) |
||
|
|
|
| #7 (permalink) | |
|
Java-Forum Team
Moderator
Registriert seit: 13.11.2005
Fachbeiträge: 32.021
Abgegebene Danke: 0
Erhielt 2.623 Danke für 2.583 Beiträge
|
im Normalfall wiederum sollte in Zeile 23 ein sleep in die Schleife,
aber wie gesagt wegen Singlethreaded wohl nicht drin so merkwürdig ist das nicht, DB ist was anderes als das Java-Programm, lasse also die Methode hier enden, du kannst nicht schon mit den Daten rechnen, wer immer der Aufrufer ist, muss sich auch mit Mittagspause zufrieden geben am Ende von onSuccess() kannst du eine andere Methode aufrufen, dann gehts weiter
__________________
Hansa wird Meister. |
|
|
|
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Methoden mit wechselndem Namen in Schleife aufrufen | cybermog | Java Basics - Anfänger-Themen | 11 | 25.02.2011 15:26 |
| Probleme beim Aufrufen von Methoden. | oshgowol | Allgemeine Java-Themen | 1 | 26.11.2008 17:44 |
| Private Methoden von auserhalb aufrufen | rogas | Java Basics - Anfänger-Themen | 2 | 08.01.2008 14:10 |
| Methoden von externen Klassen aufrufen | alshir | Java Basics - Anfänger-Themen | 3 | 05.12.2007 09:14 |
| Applet Methoden aus Javascript aufrufen | vegeta | Deployment | 3 | 10.03.2006 12:09 |
| Lesezeichen |
|
|