Das ist das Problem, das ich habe: Ich habe eine große Sequenz von einigen Objekten ( List<SomeClass>
) und möchte eine Operation für alle Elemente der Liste ausführen und eine neue Sequenz ( List<SomeOtherClass>
) erhalten.
Wie:
%Vor% Da die Operation someOperation
keine Nebenwirkungen hat und die Liste ziemlich groß ist, möchte ich diese Mapping-Operation parallelisieren.
Was wird der beste Weg sein, das in Java zu tun?
Teilen Sie die Eingabeliste, und verwenden Sie die FutureTask-Aufgabe, und führen Sie dann die Ergebnisse zusammen
So mache ich es normalerweise:
%Vor% someOperation
ist dann als aufrufbar definiert
Hinweis: Ich hatte keine try
- catch
Blöcke hier, aber Sie müssen welche haben. shutdown
sollte im Block finally
sein. Ich kann mich einfach nicht erinnern, was einen Geldautomaten auslöst, deine IDE sollte dir dabei helfen.
Doug Leas jsr166y enthält das Fork / Join-Framework, das perfekt für diese Art von Dingen ist . Es ist für die parallele Zerlegung von CPU-intensiven Jobs wie diesem ausgelegt und ist sehr effizient darin.
Wahrscheinlich der einfachste Weg, es zu benutzen, ist jedoch mit der neuen Scala 2.9 parallele Sammlungen , da es seine Verwendung vollständig abstrahiert (um eine parallele Sammlung in Scala zu erhalten, fügen Sie einfach .par
am Ende hinzu).
Beide Lösungen haben viele Tutorials und Beispiele, die über Google verfügbar sind.
Wenn Sie sicher sind, dass keine Nebeneffekte auftreten, verwenden Sie einfach Threading. Natürlich können Sie Threading verwenden, wenn es Nebenwirkungen gibt. In diesem Fall müssen Sie jedoch einige Mechanismen zum Sperren und Synchronisieren verwenden.
Ein sehr einfaches Thread-Beispiel aus Bruce Eckels ausgezeichnetem Buch Thinking in Java:
%Vor%Tags und Links java concurrency