1. Die Rolle des Thread-Schedulers
Der Thread-Scheduler bestimmt, welche Threads wie lange ausgeführt werden können. Die Skalierungsrichtlinien variieren zwischen den Betriebssystemen. Es ist wichtig, dass Sie sich nicht auf das Verhalten des Planers verlassen, um die Korrektheit oder Leistung Ihres Programms zu gewährleisten, da dies die Portabilität beeinträchtigt.
2. Strategien für robuste Programme: Thread-Balancing
Um robuste Programme zu erstellen, halten Sie eine Anzahl ausführbarer Threads nahe an der Anzahl der verfügbaren Prozessoren. Dadurch wird eine Überlastung des Schedulers vermieden und ein konsistentes Verhalten sichergestellt. Obwohl die Gesamtzahl der Threads höher sein kann, haben wartende (nicht ausführbare) Threads keinen wesentlichen Einfluss auf die Systemlast.
3. Techniken zum Verwalten von Threads: Aktives Warten und Skalieren vermeiden
Vermeiden Sie Hot Waiting, bei dem ein Thread ständig den Status einer gemeinsam genutzten Ressource überprüft. Dies verbraucht unnötig Prozessorressourcen. Verringern Sie die Anzahl der ausführbaren Threads, indem Sie Thread-Pools richtig dimensionieren (wie im Executor Framework) und Aufgaben in geeigneter Größe erstellen – nicht so klein, dass Overhead vorherrscht, und nicht so groß, dass Parallelität verhindert wird.
4. Beispiel für schlechte Praxis: Aktive Hoffnung
Der folgende Code demonstriert aktives Warten:
<code class="language-java">public class SlowCountDownLatch { private int count; public SlowCountDownLatch(int count) { this.count = count; } public void await() { while (count > 0) { // Espera-ativa: desperdício de recursos do processador } } public void countDown() { if (count > 0) { count--; } } }</code>
Dieser Code verbraucht übermäßig viele Ressourcen. Die Lösung ist die Verwendung von CountDownLatch
, das effiziente Blockierungsmechanismen nutzt.
5. Vermeiden Thread.yield()
Die Thread.yield()
-Methode ist zwischen verschiedenen JVM-Implementierungen inkonsistent und bietet keine robuste oder tragbare Lösung für Parallelitätsprobleme. Anstatt Thread.yield()
zu verwenden, strukturieren Sie den Code neu, um die Anzahl ausführbarer Threads zu reduzieren.
Falsches Beispiel:
<code class="language-java">while (!condition) { Thread.yield(); // Incorreto: uso de Thread.yield() }</code>
6. Anpassung der Thread-Priorität
Das Anpassen der Thread-Prioritäten ist ebenfalls nicht sehr portabel und variiert zwischen Betriebssystemen und JVMs. Seine Verwendung muss auf bestimmte Szenarien beschränkt werden, in denen die Verbesserung der Servicequalität den Verlust der Portabilität rechtfertigt, und darf niemals als Lösung für strukturelle Probleme dienen.
7. Schlussfolgerungen
Verlassen Sie sich nicht auf den Planer, um die Leistung Ihres Programms zu korrigieren oder zu optimieren. Vermeiden Sie die Verwendung von Thread.yield()
und übermäßige Prioritätsanpassungen. Der beste Ansatz besteht darin, Ihre Anwendungen neu zu strukturieren, um eine ausgewogene Anzahl ausführbarer Threads beizubehalten.
Beispiel aus dem Buch:
Das obige ist der detaillierte Inhalt vonElement Hängen Sie nicht vom Thread-Scheduler ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!