Frage

Ich habe ein Programm, das in einigen Threads ausgeführt wird. Der Haupt-Thread teilt ein Objekt mit den anderen Threads und in der Haupt Ich habe einen Anruf an:

synchronized(obj){
    do stuff
}

Ich habe den Verdacht, dass der Haupt-Thread verhungert ist und nicht der Zugang zu obj bekommen. Wie kann ich die Priorität des Haupt-Threads erhöhen oder ist es bereits höher als die anderen Threads standardmäßig?

War es hilfreich?

Lösung

Sie haben einen setPriority () -Methode in der Thread-Klasse.

Überprüfen Sie diese javadoc .

Einstellung Thread-Priorität auf maximal:

public static void main(String args[]) {
    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    // Your main code.
}

Andere Tipps

Die Serie von Artikeln hier einig Komplexität bei der Verwaltung von Thread-Prioritäten angeben auf verschiedenen Plattformen.

Ich frage mich, ob Ihr grundsätzliches Problem ist einfach, dass Ihre Arbeitsthreads sind sehr CPU-intensiv und daher selten einen Punkt erreichen, wo würden sie „loslassen“ des Prozessors natürlich (zum Beispiel durch ein IO oder Schlafen zu tun.) Wenn eine solche ist der Fall ist, dann können Sie einige Anrufe include () in diesen Arbeitnehmern zu erhalten, damit andere Themen eher eine Chance zu geben.

können Sie die setPriority () -Methode verwenden. Zum Beispiel:

new MyThread("Foo").start(); 
Thread bar = new MyThread("Bar"); 
bar.setPriority( Thread.NORM_PRIORITY + 1 ); 
bar.start();

Dies gibt die neue Priorität Bar, die schnell Foo übernehmen sollte

Edit:

Ihren Kommentar zu beantworten, können Sie den max priortiy eingestellt werden:

bar.setPriority( Thread.MAX_PRIORITY );

Die Erhöhung der Haupt-Thread die Priorität den Weg Macarse sagt, wird wahrscheinlich funktionieren. Allerdings setzen Sie auf der präemptiven Thread-Scheduler-Plattform richtig zu arbeiten. Sie sollten stattdessen die Thread.yield() statische Methode in der Worker-Threads aufrufen, wenn sie mit dem, was wichtige Codeabschnitte fertig sind sie ausgeführt werden. Dies ist eine gute Gewohnheit, in noch zu bekommen, wenn Sie verschiedene Ebenen der Thread-Priorität verwenden.

Wie andere bereits beantwortet, können Sie in der Tat eine Priorität einen Faden wie folgt festgelegt:

Thread.currentThread().setPriority(priority);

Aber bitte beachten Sie, in Ihrem Beispiel, dass Thread-Priorität hat nichts zu tun, in welcher Reihenfolge Threads Zugang zu einem synchronisierten Objekt zu erhalten. Java verwendet andere Kriterien für den Zugang zu geben. Siehe zum Beispiel diesen .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top