2013-07-24 26 views
5

Ich habe gelesen, dass Java-Threads Threads auf Benutzerebene sind und einer der Unterschiede zwischen Threads auf Benutzerebene und Threads auf Kernel-Ebene ist, dass Kernel-Threads vom Kernel geplant werden (wir können es nicht ändern) Für Threads auf Benutzerebene können wir einen eigenen Zeitplanungsalgorithmus definieren.So planen Sie Java-Threads

Wie also planen wir Threads in Java? Immer wenn mehrere Threads zur Ausführung bereit sind, wählt das Laufzeitsystem den Thread Runnable mit der höchsten Priorität für die Ausführung aus. Wenn zwei Threads der gleichen Priorität auf die CPU warten, wählt der Scheduler einen von ihnen so, dass er in einer Round-Robin-Art läuft. Was ist, wenn ich RR nicht will? Gibt es einen Weg, wie ich es ändern kann oder fehlt mir hier etwas?

+3

Der Versuch, solche Low-Level-Einstellungen der JVM zu ändern, ist normalerweise eine sehr schlechte Idee. Welches Problem versuchen Sie zu lösen, indem Sie die Ausführungsreihenfolge der Threads ändern? – ssindelar

Antwort

8

Sie können den Zeitplanungsalgorithmus nicht ändern, da dies für die JVM außerhalb des Bereichs liegt. Die JVM verwendet das Threading von Benutzer-Threads, die vom zugrunde liegenden Betriebssystem bereitgestellt werden.

So aus der Java-Perspektive können Sie den Zeitplanungsalgorithmus nicht ändern. Die Planung erfolgt automatisch.

Das einzige, was Sie in Java tun können, ist set the priority of the thread. Aber wie dies den Scheduling-Algorithmus beeinflusst, ist nicht definiert.

Sie können versuchen, den Planungsalgorithmus des Betriebssystems zu ändern, auf dem Ihre VM ausgeführt wird. Dies hängt jedoch stark vom verwendeten Betriebssystem ab.

2

Seit etwa 10 Jahren sind JVM-Threads Threads auf Systemebene und nicht Threads auf Benutzerebene ("grüne" Threads). Selbst für Threads auf Benutzerebene können Sie sie nicht verwalten (die JVM tut dies).

1

Die JVM-Spezifikation gibt nicht an, wie Threads von einer Implementierung geplant werden sollen. Die Hotspot-VM (und höchstwahrscheinlich fast jede andere Implementierung) verwendet die OS-Scheduling-Mechanismen (wie Uwe feststellte). Siehe auch What is the JVM Scheduling algorithm?. Ein einfacher, aber höchstwahrscheinlich nicht sehr effizienter Weg, um die Planung Ihrer Anwendungsthreads zu beeinflussen, wäre, nur n ausführbare Threads für das Betriebssystem einzuplanen (n ist die Anzahl der Threads, die Sie eigentlich parallel ausführen möchten)). Das könnte z.B. Seien Sie Ihre eigene Implementierung von ExecutorService, wodurch alle Threads, die nicht vom Betriebssystem geplant werden sollen, warten, bis Sie denken, dass sie ausgeführt werden sollten. Natürlich haben Sie so keinen Einfluss auf andere VM-Threads, geschweige denn auf andere Anwendungen oder das Betriebssystem.

Viel mehr beteiligt (und nicht plattformunabhängig) wäre es, den OS-Scheduler selbst auf etwas mehr auf die Bedürfnisse einer JVM zugeschnitten zu ändern. Eine schnelle Google-Recherche gefunden this abstract, und ich denke, es gibt mehr Arbeit auf diesem Gebiet getan.

0

In Effective Java, 2. Ausgabe, widmet Joshua Bloch der Diskussion der Thread-Planung ein Element. Er geht ausführlich darauf ein, wie der Versuch, die Thread-Planung zu optimieren, normalerweise nur zu Lösungen führt, die von der JVM-Implementierung abhängig, nicht tragbar und zerbrechlich sind.

Wenn es ein bestimmtes Zeitplanungsproblem gibt, sollten Sie für neuen Code sowieso keine Low-Level-Thread-Aufrufe durchführen. Java verfügt über Parallelbibliotheken auf höherer Ebene, die viele dieser Aufgaben vereinfachen. Anstatt die Lösung für Ihr Problem mit Threads zu definieren, sollten Sie an Executors und Tasks denken. Es gibt auch Funktionen auf höherer Ebene, die die Kommunikation zwischen Threads vereinfachen, z. B. CountDownLatch.

Low-Level-Thread-Aufrufe wie Warten, Benachrichtigen und NotifyAll kann schwierig sein, richtig zu tun.

0

Sie könnten Ihren eigenen Thread-Scheduler schreiben, analog zur Quartz job scheduler für Batch-Jobs.

Dadurch können Sie während der Ausführung Ihrer Anwendung Threads zu verschiedenen Tageszeiten ausführen.

Wenn Sie nur die Reihenfolge Ihrer Threadausführung bestimmen möchten, führen Sie den Code von einem Master-Thread aus.

Verwandte Themen