Prioridades de los threads
Con el fin de conseguir una correcta ejecución de un programa se establecen prioridades en los threads, de forma que se produzca un reparto más eficiente de los recursos disponibles. Así, en un determinado momento, interesará que un determinado proceso acabe lo antes posible sus cálculos, de forma que habrá que otorgarle más recursos (más tiempo de CPU).
Esto no significa que el resto de procesos no requieran tiempo de CPU, sino que necesitarán menos. La forma de llevar a cabo esto es gracias a las prioridades.
Cuando se crea un nuevo thread, éste hereda la prioridad del thread desde el que ha sido inicializado. Las prioridades viene definidas por variables miembro de la clase Thread, que toman valores enteros que oscilan entre la máxima prioridad MAX_PRIORITY (normalmente tiene el valor 10) y la mínima prioridad MIN_PRIORITY (valor 1), siendo la prioridad por defecto NORM_PRIORITY (valor 5). Para modificar la prioridad de un thread se utiliza el método setPriority(). Se obtiene su valor con getPriority().
El algoritmo de distribución de recursos en Java escoge por norma general aquel thread que tiene una prioridad mayor, aunque no siempre ocurra así, para evitar que algunos procesos queden “dormidos”.
Cuando hay dos o más threads de la misma prioridad (y además, dicha prioridad es la más elevada), el sistema no establecerá prioridades entre los mismos, y los ejecutará alternativamente dependiendo del sistema operativo en el que esté siendo ejecutado. Si dicho SO soporta el “time-slicing” (reparto del tiempo de CPU), como por ejemplo lo hace Windows 95/98/NT, los threads serán ejecutados alternativamente.
Un thread puede en un determinado momento renunciar a su tiempo de CPU y otorgárselo a otro thread de la misma prioridad, mediante el método yield(), aunque en ningún caso a un thread de prioridad inferior.
Fuente: Aprenda Java como si estuviera en primero de la Universidad de Navarra