2009-10-24 9 views
23

Tengo un programa que se ejecuta en unos pocos subprocesos. El hilo principal comparte un objeto con los otros hilos y en el principal tengo una llamada a:Establecimiento de prioridad en los subprocesos de Java

synchronized(obj){ 
    do stuff 
} 

Tengo la sospecha de que el hilo principal es privado y no está recibiendo el acceso a obj. ¿Cómo elevo la prioridad del hilo principal o ya es más alto que los otros hilos por defecto?

+1

Macarse ya trató sobre cómo cambiar la prioridad, pero quizás podría pegar un poco más de su código. Puede haber algo más mal, o una manera de hacer que los otros hilos pasen menos tiempo sincronizados en obj. –

+0

cómo establecer la prioridad entre 20 subprocesos, ya que la prioridad del subproceso es de 1-10, por lo que significa que solo se pueden dar prioridad a 9 subprocesos ... ?? – anshulkatta

Respuesta

35

Tiene un método setPriority() en la clase Thread.

Verificar this javadoc.

Configuración de prioridad de subprocesos a máxima:

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

, por lo que dices: en cada hilo que creo, establece setPriority (mínimo). ¿Hay alguna forma de que conozcas para establecer la prioridad del hilo principal al máximo? y hace la diferencia? – Guy

+0

He editado mi publicación con la forma de establecer la prioridad máxima para su hilo principal. No creo que vaya a hacer la diferencia. Realmente no sé lo que estás haciendo, pero los hilos de Java no deberían necesitar que cambies las prioridades para evitar la inanición. – Macarse

+3

cómo establecer la prioridad entre 20 subprocesos, ya que la prioridad de subproceso es de 1-10, por lo que significa que solo se pueden dar prioridad a 9 subprocesos ... ?? – anshulkatta

9

La serie de artículos here indica algunas complejidades en la gestión de prioridades de subprocesos en varias plataformas.

Me pregunto si su problema fundamental es simplemente que sus hilos de trabajo son muy intensivos en la CPU y por lo tanto raramente alcanzan un punto donde naturalmente "soltarían" el procesador (por ejemplo, haciendo IO o durmiendo). es el caso, entonces podría incluir algunas llamadas a yield() en esos trabajadores, lo que daría más oportunidad a otros subprocesos.

5

se puede utilizar el método setPriority(). Por ejemplo:

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

Esto da bar la nueva prioridad que debe tomar rápidamente sobre Foo

Editar:

para responder a su comentario, se puede establecer el priortiy máximo usando:

bar.setPriority(Thread.MAX_PRIORITY); 
+0

pero está estableciendo MAX_PRIORITY en el hilo y no en el hilo principal. – Guy

+0

simplemente establezca el hilo que desea para mí en MIN_PRIORITY, etc. – northpole

3

Aumentando la prioridad del hilo principal de la manera Macarse dice que probablemente funcione. Sin embargo, confía en que el planificador de hilos preventivos de la plataforma funcione correctamente. En su lugar, debe llamar al método estático Thread.yield() en sus subprocesos de trabajo cuando hayan terminado con las secciones importantes de código que están ejecutando. Este es un buen hábito para entrar incluso cuando usa diferentes niveles de prioridad de subprocesos.

0

Como otros ya contestadas, que de hecho se puede establecer una prioridad de un hilo de la siguiente manera:

Thread.currentThread().setPriority(priority); 

Pero tenga en cuenta, en su ejemplo, que la prioridad del hilo tiene nada que ver en qué orden hilos tienen acceso a un objeto sincronizado. Java usa otros criterios para dar acceso. Ver por ejemplo this.

Cuestiones relacionadas