2016-04-14 13 views
3

Gibt es irgendwelche Annahmen darüber, wie fair JVM ist, wenn es darum geht, Threads für die Ausführung zu planen?JVM Fairness bei der Planung von Threads

Für den folgenden Ausschnitt, ist es möglich, dass "Code A" nur ausgeführt wird, wobei B ignoriert wird?

public static void main(String args[]) { 

    new Thread() { 
     public void run() { 
     for (;;) { /* code A */ } 
     } 
    }.start(); 

    new Thread() { 
     public void run() { 
     for (;;) { /* code B */ } 
     } 
    }.start(); 

} 

Die Frage ist eher eine theoretische - nehmen wir an, dass weder der Fäden blockiert wird oder auf andere Weise fördert Scheduler Kontext zu wechseln.

+0

Ihr Betriebssystem unterstützt höchstwahrscheinlich präemptives Multitasking. In diesem Fall wird der Kontext diese Threads wechseln. Wenn Sie mehr als eine freie CPU haben, laufen beide die meiste Zeit. –

+0

Guter Punkt für CPU-Nummer. Ich dachte nur an ein CPU-Szenario. –

+0

Die meisten Computer haben heutzutage viele CPUs, sogar Mobiltelefone und Raspberry PIs. ;) –

Antwort

2

Gibt es irgendwelche Annahmen darüber, wie fair JVM ist, wenn es darum geht, Threads für die Ausführung zu planen?

Nr

Für den unten Schnipsel ist es möglich, "Code A" nur ausgeführt zu haben, mit B ignoriert werden?

In der Theorie ja.

In der Praxis:

  • wenn es ein (verfügbar) Kern ist, würde ich den OS-Level-Thread-Scheduler zu Zeitscheibe der Fäden erwarten, so dass sie jeweils rund 50% der zur Verfügung stehenden Zeit bekamen im Log-Term

  • Wenn es mehrere (verfügbare) Kerne gäbe, würde ich erwarten, dass die zwei Threads parallel laufen.


Beachten Sie, dass weder die JLS oder die JVM Spezifikation sagt nichts über Thread-Scheduling oder Fairness. Auch das Javadoc für Thread.

Nach meinem Wissen ist die einzige Java-API, die Fairness erwähnt, die ReentrantLock API (javadoc), wo es einen Konstruktorparameter zum Erstellen einer Sperre mit einer Fairness-Richtlinie gibt. Dies bedeutet, dass der Scheduler den Thread bevorzugt, der am längsten auf der Sperre gewartet hat. Aber auch das ist zu befürchten:

"Beachten Sie jedoch, dass die Fairness der Sperren keine Fairness der Thread-Planung garantiert."

+2

Das setzt voraus, dass es nur eine CPU gibt. Auf einem Multi-CPU-System mit Ersatz-CPU wird es wahrscheinlich fast immer laufen. +1 –

Verwandte Themen