FIGURE <strong>7.</strong>4El estado BloqueadoUn hilo pue<strong>de</strong> tambien llegar a quedar bloqueado si este falla para adquirir elseguro para un monitor o si este emite un llamado al método wait(). Losseguros y monitores son explicados en <strong>de</strong>talle mas a<strong>de</strong>lante en este capitulo,en la seccion "Monitores, wait(), y notify()." Internamente, muchosbloqueos para I/O, como llamadas a read() son discutidas, se implementanusando llamadas a wait() y notify().Estado MonitorLa Figura <strong>7.</strong>5 muestra todos <strong>los</strong> estados <strong>de</strong> transición <strong>de</strong> <strong>los</strong> hi<strong>los</strong> . Losestados intermedios <strong>de</strong>l lado <strong>de</strong>recho <strong>de</strong> la figura (Suspendido, Dormido, yBloqueado) han sido discutidos en las secciones previas. Los estados <strong>de</strong>Monitor son dibujados so<strong>los</strong> en el lado izquierdo <strong>de</strong> la figura para hacerénfasis en que el<strong>los</strong> son muy diferentes <strong>de</strong> <strong>los</strong> otros estados intermedios .FIGURE <strong>7.</strong>5Estados <strong>de</strong> <strong>los</strong> hi<strong>los</strong> (reprise)
EL método wait() coloca un hilo en ejecución en el estado <strong>de</strong> espera(Waiting), y <strong>los</strong> métodos notify( ) y notifyAll() colocan <strong>los</strong> hi<strong>los</strong> queestán en espera al estado listo (Ready). Sin embargo, Estos métodoson muy diferentes <strong>de</strong> suspend(), resume(), y yield( ). Por <strong>los</strong>iguiente, El<strong>los</strong> esrtan implementados en la claseObject , no en laclase Thread. Por otro lado, el<strong>los</strong> pue<strong>de</strong>n solamente ser llamados enel código synchronized . el estado <strong>de</strong> espera (Waiting), y lo asuntosasociados, son discutidos en la sección final <strong>de</strong> este capitulo. Peroprimero, hay un tópico mas concerniente al control <strong>de</strong> hi<strong>los</strong> que tratar.Implementaciones <strong>de</strong> la ProgramaciónHistóricamente , dos aproximaciones han surgido para implementar <strong>los</strong>programadores <strong>de</strong> hi<strong>los</strong>:• Programación Preferencial• Divisiones <strong>de</strong> tiempo o programación round-robinHasta ahora, las facilida<strong>de</strong>s <strong>de</strong>scritas en este capitulo han sidopreferenciales. En programación preferencial , hay solo dos formas para queun hilo salga <strong>de</strong>l estado <strong>de</strong> ejecución (Running) sin llamar explícitamente unmétodo programador <strong>de</strong> hi<strong>los</strong> al como waitQ or suspendQ:• <strong>Este</strong> pue<strong>de</strong> cesar <strong>de</strong> estar listo para ejecutarse (llamando un método <strong>de</strong>bloqueo I/O , por ejemplo).• <strong>Este</strong> pue<strong>de</strong> conseguir ser cambiado fuera <strong>de</strong> la CPU por un hilo <strong>de</strong> mas altaprioridad que este listo para ejecutarse.Con divisiones <strong>de</strong> tiempo, un hilo pue<strong>de</strong> solamente ejecutarse por unacantidad <strong>de</strong> tiempo limitada. <strong>Este</strong> luego es cambiado al estado listo, don<strong>de</strong>este competiría con todos <strong>los</strong> otros hi<strong>los</strong> en este mismo estado. Lasdivisiones <strong>de</strong> tiempo aseguran <strong>de</strong> nuevo la posibilidad <strong>de</strong> que un único hilo<strong>de</strong> alta prioridad consiga el estado <strong>de</strong> ejecución y nunca estén fuera,previniendo a todos <strong>los</strong> otros hi<strong>los</strong> <strong>de</strong> hacer estas tareas.<strong>de</strong>safortunadamente, las divisiones <strong>de</strong> tiempo crean un sistema no<strong>de</strong>terminístico;en cualquier momento no se pue<strong>de</strong> saber con certeza cualhilo se está ejecutando o durante cuanto tiempo este continuará la ejecución.Es natural preguntar que implementación usa Java. La respuesta es que esto<strong>de</strong>pen<strong>de</strong> <strong>de</strong> la plataforma; la especificación Java da implementaciones unpoco libres. Las maquinas Solaris son preferenciales. Las Macintosh son porinterva<strong>los</strong> <strong>de</strong> tiempo. Las plataformas Windows fueron originalmentepreferenciales, pero cambiaron a interva<strong>los</strong> <strong>de</strong> tiempo con la versión 1.0.2<strong>de</strong>l JDK.Monitores, wait(), y notify()Un monitor es un objeto que pue<strong>de</strong> bloquear y revivir hi<strong>los</strong>. El concepto essimple, pero toma un poco <strong>de</strong> trabajo enten<strong>de</strong>r para que son buenos <strong>los</strong>