2015-08-19 5 views
5

Beispiel:Java-Multithreading-Priorität: Warum tritt in diesem Beispiel manchmal t1 auf, bevor t2 abgeschlossen ist, selbst wenn t2 eine höhere Priorität hat?

class MyThread extends Thread{ 
public MyThread(String name) { 
    super(name); 
} 

public void run(){ 
    for (int i=0; i<5; i++) { 
     System.out.println(Thread.currentThread().getName() 
       +"("+Thread.currentThread().getPriority()+ ")" 
       +", loop "+i); 
    } 
} 
}; 

public class Demo { 
    public static void main(String[] args) { 

    System.out.println(Thread.currentThread().getName() 
      +"("+Thread.currentThread().getPriority()+ ")"); 

    Thread t1=new MyThread("t1"); // t1 
    Thread t2=new MyThread("t2"); // t2 
    t1.setPriority(1);    // t1 priority 1 
    t2.setPriority(10);    //t2 priority 10 
    t1.start();      // start t1 
    t2.start();      // start t2 
} 
} 

Wenn ich das Programm ausführen, haben einige Male habe ich die Ausgabe wie folgt:

//Output1 
main(5) 
t2(10), loop 0 
t2(10), loop 1 
t2(10), loop 2 
t2(10), loop 3 
t2(10), loop 4 
t1(1), loop 0 
t1(1), loop 1 
t1(1), loop 2 
t1(1), loop 3 
t1(1), loop 4 

Manchmal habe ich eine Ausgabe wie folgt:

//Output2 
main(5) 
t1(1), loop 0 
t1(1), loop 1 
t1(1), loop 2 
t1(1), loop 3 
t1(1), loop 4 
t2(10), loop 0 
t2(10), loop 1 
t2(10), loop 2 
t2(10), loop 3 
t2(10), loop 4 

In einigen anderen Gelegenheiten, die ich ausgegeben habe, wo t1 zuerst beginnt, und t2 beginnt, bevor t1 die gesamte Ausgabe beendet.

Ich dachte output1 macht mehr Sinn als “Threads with higher priority are executed in preference to threads with lower priority.” Wie können wir die Gründe hinter diesem Beispiel verstehen?

+5

Sie könnten von [this] (http://www.javamex.com/tutorials/threads/priority_what.shtml) – DSlomer64

Antwort

2

Wie Sie bereits in Ihrem Beitrag erwähnt:

Das bedeutet „Threads mit höherer Priorität bevorzugt gegenüber Threads mit niedrigerer Priorität ausgeführt werden,“ dass ein Thread mit höherer Priorität hat eine höhere Wahrscheinlichkeit von ausgeführt werden als eine Low-Priority-Thread. Es bedeutet nicht, dass ein Thread mit höherer Priorität immer zuerst ausgeführt/beendet wird. Die tatsächliche Thread-Handhabung hängt vom Betriebssystem ab (Java verwendet einfach die Thread-Bibliotheken, die von dem Betriebssystem bereitgestellt werden, auf dem es ausgeführt wird).

+0

für den downvoter profitieren: bitte erklären Sie ** warum ** Sie die Antwort – Paul

+0

downvoted Ich habe Sie nicht downvote , aber eine Möglichkeit ist, dass die Antwort ziemlich allgemein ist und OPs Code – user140547

+0

@ user140547 nicht adressiert yeah, könnte – Paul

3

Ihr niedriger priorisierter Thread wird zuerst gestartet, daher kann er in einigen Fällen abgeschlossen sein, noch bevor der höher priorisierte Thread startet. 5 Iterationen ist nicht so viel. Wenn ich auf meiner (Windows-) Maschine die Anzahl der Iterationen durch 100 ersetze, wird der Thread mit der höheren Priorität immer zuerst ausgewählt.

0

Meine Notizen über Themen Prioritäten:

  • Sie es zur Verbesserung der Leistung
  • Prioritäten abhängig von OS verwenden können (Windows 7, Linux ignoriert sie)
  • Dont gestalten Sie Ihre App in Art und Weise richtig, wo Arbeiten hängt von Prioritäten ab
  • Wenn es einige Threads mit hohen Prioritäten gibt, die nie deaktiviert werden, können Threads mit niedrigeren Prioritäten nie ausgeführt werden
+0

möglich sein Wenn Sie Faustregeln sammeln, hier ist ein anderes: Threads, die Ressourcen freigeben, sollten mit einer höheren Priorität als laufen Threads, die sie beanspruchen möchten. –

Verwandte Themen