Während ich an meiner Java-Anwendung arbeite, habe ich einen einfachen Multithreading-Fall (einen asynchronen Ressourcenlader-Thread und einen Haupt-Thread, der darauf wartet, dass der Ladevorgang beendet wird, die Benutzeroberfläche mit dem Fortschritt zu aktualisieren), was ich durch Aufrufen vonThread.Yield() als schädlich angesehen?
lösen könntewhile(!foo.isInitialized()) {
Thread.yield();
}
im Hauptthread. Ich bin mir bewusst, dass es robustere Lösungen gibt; immer noch, der Lader ist nicht von mir entworfen und es ist eine im Grunde nur Lese-Bibliothek (ich kann nicht einfach wait()
, weil ich kann es nicht senden mir eine notify()
; auch, es stirbt nicht nach der Fertigstellung), und ich muss nur warten, bis das Laden abgeschlossen ist.
Java doc sagt, dass (beachten Sie diese not present in 1,6 docs war und wurde von 1,7 docs hinzugefügt)
Es ist selten angezeigt, diese Methode zu verwenden.
NetBeans warnt mich, dass
Invocation von Verfahren
yield()
aufjava.lang.Thread
in der Regel Synchronisationsprobleme verwendet wird, um Maskerade und sollte vermieden werden.
Google Codepro AnalytiX, OTOH, sagt
Verfahren
Thread.yield()
sollte nicht verwendet werden, weil sein Verhalten auf allen Plattformen nicht konsistent ist.
Sollte ich mit diesen Warnungen betroffen sein und versuchen, eine bessere Lösung zu finden (alle Vorschläge sind willkommen), oder sollte ich diejenigen, die als „Warnung Lärm“ betrachten und zu unterdrücken/sie ignorieren?
Hinweis: Ich dachte über die offensichtliche Möglichkeit der Verwendung sleep()
(Are Thread.sleep(0) and Thread.yield() statements equivalent? ist hier erwähnenswert); Trotzdem, wenn yield
kein "Bonus" über das ständige Schlafen hat, warum stellt Java es überhaupt zur Verfügung - und was sind dann die gültigen Anwendungsfälle dafür?
leicht bezogen werden: Is there a better solution to Thread.yield()? & Thread.Sleep or Thread.Yield
Sehr schädlich. Was ist, wenn es keinen anderen ready-to-run-Thread gibt, dem man nachgeben kann? Wenn du auf etwas warten willst, * warte * darauf. –
@DavidSchwartz Es wird einfach vom Thread-Scheduler ignoriert. – Mordechai
Ja, Sie sollten besorgt sein. Kannst du mehr erklären, was du tatsächlich erreichen willst? Was ist dein Ziel hier? – markspace