Ich nehme ein List[Int]
und möchte parallel nach einem Wert x
wo x * 10 > 500
suchen. Daher sollte exists
true
zurückgeben, wenn die Liste einen Wert von 51 oder höher enthält.
Was Ergebnisse liefert:
%Vor%Ich benutze eine Dual-Core-Maschine mit Scala 2.9.1.
Was ist hier los? Funktioniert das wie beabsichtigt? Warum sendet es nicht einfach die Nachricht an die anderen Threads, um die Mission abzubrechen, sobald das erste Ergebnis gefunden wird? Dies könnte sehr kostspielig sein, wenn f
eine teure Berechnung ist.
find
scheint auf ähnliche Weise zu funktionieren und sucht nach vielen weiteren Werten, obwohl die Dokumente sagen, dass das "Element nicht unbedingt das erste derartige Element in der Iterationsreihenfolge sein muss" und "die Wahl ist nicht deterministisch" / p>
Warum sendet es nicht einfach die Nachricht an die anderen Threads zum Abbrechen Mission, sobald das erste Ergebnis gefunden wird?
Weil das nicht möglich ist. JAVA LASST DAS NICHT TUN. Oder eher, aber es ist veraltet.
Siehe Beschreibung von (veraltet) Thread.stop()
:
Diese Methode ist von Natur aus unsicher. Stoppen eines Threads mit Thread.stop bewirkt, dass alle von ihm gesperrten Monitore entsperrt werden (als natürliche Folge der ungeprüften ThreadDeath-Ausnahme den Stapel hoch). Wenn eines der zuvor von diesen geschützten Objekte Monitore waren in einem inkonsistenten Zustand, die beschädigten Objekte wurden sichtbar für andere Threads, was möglicherweise zu willkürlichem Verhalten führt. Viele Verwendungen von stop sollten durch Code ersetzt werden, der einfach einige modifiziert Variable, um anzuzeigen, dass der Zielthread nicht mehr ausgeführt werden soll. Das Der Ziel-Thread sollte diese Variable regelmäßig überprüfen und von dort zurückkehren seine Laufmethode in geordneter Weise, wenn die Variable dies anzeigt ist aufhören zu laufen. Wenn der Zielthread lange Zeit wartet (auf einem B. die Zustandsvariable), sollte die Interrupt-Methode verwendet werden um das Warten zu unterbrechen. Weitere Informationen finden Sie unter Warum sind Thread.stop, Thread.suspend und Thread.resume Veraltet? .
Mit anderen Worten, da Multithreaded-Code mit Sperren inhärent gebrochen ist, verwarfen sie eine vollkommen gute Methode, die gerne mit Threads verwendet werden kann, die keinen veränderlichen Zustand teilen und daher keine Datenstrukturen sperren müssen.
Ich verstehe den Wunsch, weil ich dachte, dass es nett wäre, ein solches Verhalten zu haben - aus der Absicht, schnellen, existenten Code zu verwenden, sieht es vernünftig aus, es zu erwarten, aber natürlich, wie sollte es implementiert werden?
In Abkürzungsausdrücken wird der nächste Aufruf nicht gestartet, wenn das Ergebnis gefunden wird - das ist einfach.
Aber wie laufen Sie hinter einer Aufgabe, die Sie erledigt haben, und fangen Sie sie erneut, um sie zu stoppen? Sie müssten wissen, welcher von ihnen bereits beendet ist, und vielleicht in eine Wettlaufsituation geraten, denn während des Testens, ob es noch läuft, könnte es "wahr" zurückgeben, aber anschließend unvollkommen enden.
Die Funktion, die in exists
aufgerufen wird, könnte neue Threads selbst starten - wie sollten sie generell von außen gestoppt werden? Indem Sie optional eine stop execution
-Methode als zweiten Parameter angeben?
Tags und Links scala parallel-processing parallel-collections