Domanda

Ho un programma che gira in pochi thread. Il thread principale condivide un oggetto con gli altri thread e nel complesso ho una chiamata a:

synchronized(obj){
    do stuff
}

Ho il sospetto che il thread principale sia affamato e non riesca ad accedere a obj . Come posso aumentare la priorità del thread principale o è già superiore rispetto agli altri thread per impostazione predefinita?

È stato utile?

Soluzione

Hai un metodo setPriority () nella classe Thread.

Controlla questo javadoc .

Impostazione della priorità del thread al massimo:

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

Altri suggerimenti

La serie di articoli qui indicano alcune complessità nella gestione delle priorità dei thread su varie piattaforme.

Mi chiedo se il tuo problema fondamentale sia semplicemente che i tuoi thread di lavoro richiedono molta CPU e quindi raramente raggiungono un punto in cui "lasciano andare" naturalmente del processore (ad esempio facendo un po 'di IO o dormendo.) In tal caso, potresti includere alcune chiamate a yield () in quei lavoratori, dando quindi ad altri thread più possibilità.

puoi usare il metodo setPriority (). Ad esempio:

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

In questo modo si esclude la nuova priorità che dovrebbe rapidamente assumere Foo

Modifica:

Per rispondere al tuo commento, puoi impostare la priorità massima usando:

bar.setPriority( Thread.MAX_PRIORITY );

Aumentando la priorità della discussione principale Macarse dice che probabilmente funzionerà. Tuttavia, stai facendo affidamento sul programmatore di thread preventivo della piattaforma per funzionare correttamente. Dovresti invece chiamare il metodo statico Thread.yield () nei tuoi thread di lavoro quando hanno finito con tutte le sezioni importanti di codice che stanno eseguendo. Questa è una buona abitudine da prendere anche quando si usano diversi livelli di priorità del thread.

Come altri hanno già risposto, puoi in effetti impostare una priorità su un thread come segue:

Thread.currentThread().setPriority(priority);

Ma, nel tuo esempio, tieni presente che la priorità del thread non ha nulla a che fare nell'ordine in cui i thread ottengono l'accesso a un oggetto sincronizzato. Java utilizza altri criteri per consentire l'accesso. Vedi ad esempio this .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top