de estados de UML de la fi gura 23.1, el estado 

terminado va seguido por el estado fi nal de UML (el símbolo de 

viñeta) para indicar el fi nal de las transiciones de estado.

A nivel del sistema operativo, el estado 

ejecutable de Java generalmente abarca dos estados separados (fi gura 

23.2). El sistema operativo oculta estos estados de la Máquina Virtual de Java (JVM), la cual sólo ve el estado 
ejecutable. Cuando un subproceso cambia por primera vez al estado ejecutable desde el estado nuevo, el subproceso 
se encuentra en el estado 

listo

. Un subproceso 

listo entra al estado 

en ejecución

 (es decir, empieza su ejecución) 

cuando el sistema operativo lo asigna a un procesador; a esto también se le conoce como 

despachar el subproce-

so

. En la mayoría de los sistemas operativos, a cada subproceso se le otorga una pequeña cantidad de tiempo del 

procesador (lo cual se conoce como 

quantum

 o 

intervalo de tiempo

) en la que debe realizar su tarea. (El proceso 

de decidir qué tan grande debe ser el quantum de tiempo es un tema clave en los cursos de sistemas operativos). 
Cuando expira su quantum, el subproceso regresa al estado 

listo y el sistema operativo asigna otro subproceso al 

procesador (vea la sección 23.3). Las transiciones entre los estados 

listo y en ejecución las maneja únicamente el 

sistema operativo. La JVM no “ve” las transiciones; simplemente ve el subproceso como 

ejecutable y deja al sistema 

operativo la decisión de cambiar el subproceso entre 

listo y ejecutable. El proceso que utiliza un sistema operativo 

para determinar qué subproceso debe despachar se conoce como 

programación de subprocesos

, y depende de 

las prioridades de los subprocesos (que veremos en la siguiente sección).

23.3 Prioridades y programación de subprocesos

Todo subproceso en Java tiene una 

prioridad de subproceso

, la cual ayuda al sistema operativo a determinar el 

orden en el que se programan los subprocesos. Las prioridades de Java varían entre 

MIN_PRIORITY

 (una constante 

de 1) y 

MAX_PRIORITY

 (una constante de 10). De manera predeterminada, cada subproceso recibe la prioridad 

NORM_PRIORITY

 (una constante de 5). Cada nuevo subproceso hereda la prioridad del subproceso que lo creó. 

De manera informal, los subprocesos de mayor prioridad son más importantes para un programa, y se les debe 
asignar tiempo del procesador antes que a los subprocesos de menor prioridad. Sin embargo, las prioridades de 
los subprocesos no garantizan el orden en el que se ejecutan los subprocesos.

[

Nota: las constantes (

MAX_PRIORITY

,

MIN_PRIORITY

 y 

NORM_PRIORITY

) se declaran en la clase 

Thread

. Se 

recomienda no crear y usar explícitamente objetos 

Thread

 para implementar la concurrencia, sino utilizar mejor 

la interfaz 

Executor

 (que describiremos en la sección 23.4.2). La clase 

Thread

 contiene varios métodos 

static

útiles, los cuales describiremos más adelante en este capítulo].

La mayoría de los sistemas operativos soportan los intervalos de tiempo (timeslicing), que permiten a los 

subprocesos de igual prioridad compartir un procesador. Sin el intervalo de tiempo, cada subproceso en un con-
junto de subprocesos de igual prioridad se ejecuta hasta completarse (a menos que deje el estado 

ejecutable y entre 

al estado 

en espera o en espera sincronizado, o lo interrumpa un subproceso de mayor prioridad) antes que otros 

subprocesos de igual prioridad tengan oportunidad de ejecutarse. Con el intervalo de tiempo, aun si un subpro-
ceso no ha terminado de ejecutarse cuando expira su quantum, el procesador se quita del subproceso y pasa al 
siguiente subproceso de igual prioridad, si hay uno disponible.

El 

programador de subprocesos

 de un sistema operativo determina cuál subproceso se debe ejecutar a 

continuación. Una implementación simple del programador de subprocesos mantiene el subproceso de mayor 
prioridad en 

ejecución en todo momento y, si hay más de un subproceso de mayor prioridad, asegura que todos 

esos subprocesos se ejecuten durante un quantum cada uno, en forma 

cíclica (round-robin)

. En la fi gura 23.3 

se muestra una 

cola de prioridades multinivel

 para los subprocesos. En la fi gura, suponiendo que hay una 

computadora con un solo procesador, los subprocesos A y B se ejecutan cada uno durante un quantum, en forma 
cíclica hasta que ambos subprocesos terminan su ejecución. Esto signifi ca que A obtiene un quantum de tiempo 

Figura 23.2 

 |  Vista interna del sistema operativo del estado ejecutable de Java.

ejecutable

ejecutable

expira quantum

el sistema operativo 

despacha un subproceso

listo

23.3 Prioridades y programación de subprocesos 

929

23_MAQ_CAP_23_DEITEL.indd929

4/19/081:33:36AM