Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Aufgabe 2.4: Fibonacci-Service
Hallo,
und zwar habe ich die Aufgabe „fertig“ bearbeitet und alle Testcases stimmen auch bei mir, aber das sagt ja erstens nichts darüber aus ob es parallel abläuft die Berechnung und zweitens habe ich mit viel mühe und auch bisschen raten in meinem Programm was zusammengebastelt…
deshalb auch eine frage zum verständnis wie eigentlich mit einem „newFixedThreadPool“ genau abläuft…
in der Vorlesungsfolie 02-46 „Arbeitspakete am Beispiel Reisevorbereitung“ steht folgendes:
man hat in diesem beispiel ja soweit ich verstanden habe 3 Threads erstellt, richtig?
wird jetzt jedem Thread eine aufgabe automatisch zugeordnet?? oder bedeutet das oben nun sowas wie „ein thread kümmert sich um die Unterkunft und der nächste um das Transportmittel“ ,also entsprechend einer manuellen zuordnung? :scared:
Dafür brauch ich ein größeres Beispiel ;).
ExecutorService e = Executors.newFixedThreadPool(3);
e.execute(new Arbeitspaket1());
e.execute(new Arbeitspaket2());
e.execute(new Arbeitspaket3());
e.execute(new Arbeitspaket4());
e.execute(new Arbeitspaket5());
...
Mit der ersten Zeile erstellst du einen Thread Pool der insgesamt 3 Threads verwendet.
Bei dem FixedThreadPool ist in der JVM folgendes verhalten vorgesehen:
e.execute(new Arbeitspaket1());
Thread 1 wird erstellt. Thread 1 bearbeitet Arbeitspaket1.
e.execute(new Arbeitspaket2());
Thread 2 wird erstellt. Thread 2 bearbeitet Arbeitspaket2.
e.execute(new Arbeitspaket3());
Thread 3 wird erstellt. Thread 3 bearbeitet Arbeitspaket3.
e.execute(new Arbeitspaket4());
Der erste Thread (1,2,3) der fertig ist, übernimmt die Bearbeitung von Arbeitspaket 4.
e.execute(new Arbeitspaket5());
Der erste Thread (1,2,3) der fertig ist, übernimmt die Bearbeitung von Arbeitspaket 5.
…
Also es wird keinem Thread manuell ein Arbeitspaket zugeordnet. Java garantiert dir aber,
das für die ersten 3 Arbeitspakete (wegen newFixedThreadPool(3)) jeweils ein extra Thread erzeugt wird.
Will ich die explizite Bindung von einem Thread an ein Arbeitspaket darf ich keinen ExecutorService nutzen.
Bei den PFP Aufgabenstellung heißt es hin und wieder, xyz soll von einem eigenen Thread übernommen werden.
Dann fällt der ExecutorService als Lösung weg, da genau das nicht garantiert ist.
Ich hoffe das hilft dir weiter ;).
Das hat fürs Verständnis wirklich sehr geholfen! Super Beispiel!
Danke dir !
Edit: Hat sich erledigt.
Über diesen einen Satz stolper ich immer wieder:
Wirklich? So ganz sicher bin ich mir da nicht, aber nach dem ich mir FibServiceTest.java angeschaut habe, glaube ich, muss man eher folgendes machen:
Oder hab ich da was falsch verstanden ?
@Kuno_See - ich denke du hast recht, zumindest laufen die Tests durch wenn man es so implementiert:
Für die Zahl x an Stelle i im Array args soll die x-te Fibonacci-Zahl berechnet und im Ergebnisarray an Stelle i gespeichert werden
Habe auch noch eine Frage bezüglich der Rückgabe in calculateFibs()
Als Rückgabe wird ja ein long Array erwartet, die Ergebnisse aber in einem Future gespeichert.
Wie kann ich jetzt meine berechneten Zahlen an die aufrufende Funktion zurückgeben?
Wenn ich es mit return results; versuche, kommt die Fehlermeldung:
Type mismatch canno’t convert from Future[] to long[]
Gleiche Fehlermeldung, wenn ich die Zahlen in ein long Array übertragen will.
In der Angabe steht etwas von einer get()-Funktion, vielleicht solltest du die mal ausprobieren.
[quote=sim[ulation]]
Wie kann ich jetzt meine berechneten Zahlen an die aufrufende Funktion zurückgeben?
[/quote]
Kleine Ergänzung noch: Die Future-Objekte sind nicht deine berechneten Zahlen. Wenn du [m]submit()[/m] aufrufst, wird deine Berechnung auf einem der Threads des ExecutorService ausgeführt. Dies muss aber nicht unmittelbar geschehen, sondern kann auch erst in der Zukunft durchgeführt werden (du willst ja die Berechnungen parallel ausführen, daher darf [m]submit()[/m] gar nicht warten, bis das Ergebnis vorliegt). Daher gibt dir [m]submit()[/m] ein Objekt zurück, das nur ein Platzhalter für einen in der Zukunft berechneten Rückgabewert ist. An den tatsächlichen Rückgabewert kommst du, wie schon von meinem Vorposter erklärt, mittels [m]get()[/m] heran. Diese Methode blockiert so lange, bis der Rückgabewert tatsächlich vorliegt.
um results auszugeben müsste ich ja dann beispielsweiße “long a = results.get();” ausführen, richtig?
bei mir kennt er die Methode get() anscheinend nicht vom Future.
results ist doch das Future Array oder? Du musst ihm dann ja noch übergeben welches Element du meinst. Also z.B. “long a = results[0].get();”
InterruptedException,ExecutionError
Die methode .get() wirft beide Exceptions. Aber wenn ich das der calculateFibs sage, stimmt der Tester nichtmehr…was mach ich falsch?
Lg
Eigelb
Du musst die Exceptions mit catch abfangen und darfst sie nicht per throw in die Methodendeklaration schreiben. Sonst wird der Test nicht mehr mit deiner Abgabe kompilieren.
ja, perfekt, danke