Aufgabe 6.7

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 6.7
Ich steh grad bei der e) aufm Schlauch und versteh nicht ganz wieso take überhaupt blockiert bzw wie das geändert werden kann?


Wenn kein Arbeitspaket seit dem letzten Aufruf von [m]poll()[/m] und [m]take()[/m] fertiggestellt wurde, soll [m]take()[/m] solange warten, bis es ein neues Arbeitspaket gibt. Das ist mit dem Wort „blockieren“ gemeint. Das Verhalten ist also analog zur [m]BlockingQueue[/m]. Wenn sich der letzte Thread beendet hat, kann ja kein neues Arbeitspaket fertiggestellt werden. [m]take()[/m] würde also, wenn die Warteschlange leer ist, unbeschränkt warten. Das soll verhindert werden, indem in diesem Fall eben nicht gewartet, sondern [m]null[/m] zurückgegeben wird. Es soll sich dann also wie [m]poll()[/m] verhalten.


Ich komme bei der Aufgabe auch gerade nicht weiter:

Was versteht man in der Aufgabe 6.7 c) unter dem Abarbeiten von Aufträgen? Wäre das ein Aufruf der run-Methode?

Ist das workers-Array zum Speichern der Threads da?


Hallo Leute,

bräuchte kurz mal jemanden der mir dabei hilft, ein Verständnisproblem zu klären, eigentlich schon bei der b) und schlängelt sich durch die ganze Aufgabe, wie ich diese Schlendrians hasse :smiley:

Und zwar, versteh ich nicht wie man das mit submit schon handhaben soll, dass das ein Futur Objekt als Rückgabewert hat, wenn eigentlich take() und poll() dazu da sind um Elemente zu entnehmen. Wie soll dann submit() die Aufträge verteilen und zusätzlich den richtigen Wert zurückgeben? Das muss ja dann auch die Wartezeit mit beinhalten, im Falle, dass alle Threads zum Zeitpunkt des submit-Aufrufs beschäftigt sind oder nicht?
Zwei LinkedBlockingQueues muss man selbst implementieren, tut man dann in den take() und poll() Methoden nicht nichts anderes als take() und poll() Methoden der LinkedBlockingQueues einzubauen und gegebenenfalls noch Bedingungen mit Poisonpills zu schaffen?

Wär schön wenn jemand Bock hätte zu helfen und schade wenn die Aufgabe nicht läuft. Dreh mich hier schon mittlerweile in einer 20cm Kuhle im Kreis und die wird nur tiefer schätze ich…Wetter ist zu gut um im Schatten zu tanzen…

bis dahin tudelu


Also zu dem FutureTask einfach mal die api lesen, Future Task, vor allem der Konstruktor ist interessant für deinen „richtigen Wert“.
Da du die Tasks ja in die Liste gibst, aus der sich die Threads die Aufgaben dann holen, ist es ja egal ob alle grad beschäftigt sind, wenn der eine fertig ist holt er sich halt den nächsten Task.

Das musst du schon für dich selber herrausfinden, klar ist wahrscheinlich, dass du das Rad nicht neu erfinden musst :smiley:


Habe auch noch eine Frage zu Aufgabe 6.7. Woran kann es liegen, dass bei mir lokal die Testfälle fehlerfrei durchlaufen. Lade ich allerdings im EST hoch, bekomme ich ein Ausrufungszeichen mit Error in given Testcase. Habe zZ keine Ahnung woran es liegen könnte. Werden im EST bei der Abgabe noch weitere Testfälle getestet, die wir in der CompletionServiceTest nicht gegeben haben?


Das Problem hatte ich auch. Auf meinem PC hat alles funktioniert, auf dem langsameren/schnelleren/anderen EST-Rechner ist es dann kaputt gegangen. Testen hilft da wahrscheinlich wenig, am besten noch mal den Code durchgehen und nach möglichen Wettlaufsituationen oder Verklemmungen suchen.


Was sollen wir eigentlich machen, wenn wir die wait()-Methode der Liste verwenden und ne InterruptedException fliegt?
Catchen oder weiterwerfen?


Hey kann mir vielleicht jemand erklären was genau bei der 6.b) zu machen ist? Ich werd aus der Aufgabenstellung nicht schlau.
DAnke im vorraus.


submit soll wie in der Aufgabe erwähnt, mittels LinkedBlockingQueue Aufträge an die Threads verteilen…FutureTask dient eigentlich als Paket wo du das übergebene Callable reinsteckst und weiterschickst…
Da submit beliebig oft hintereinander aufgerufen werden kann und dadurch beliebig viele Arbeitsaufträge entstehen können, ist es eine gute Idee zwischenzulagern…hier kommt die Queue ins Spiel, die dein Paketzentrum darstellt, von dem die Arbeiter (workers) ihre Aufträge abholen, fertigstellen und die erledigten Aufträge in einem weiteren Lager zur Abholung bereitstellen…