La programación multihilo es un paradigma conceptual de la programación pro el cual se dividen los programas en dos o más procesos que se pueden ejecutar en paralelo. En un momento dado pueden haber datos de entrada de usuario a los que responder, animaciones y visualizaciones de interfaz de usuario, también cálculos grandes que podrían tardar varios segundos en terminar, y nuestros programas tendrán que tratar con estos temas sin provocar retrasos desagradables al usuario.
LA SENTENCIA SYNCHRONIZED
Si se utiliza una clase que no fue diseñada para accesos multihilo y, por ello, dispone de métodos no sincronizados que manipulan el estado interno, puede envolver la llamada al método en un bloque sincronizado. El formato general de la sentencia sincronizada es el siguiente:
synchronized(objeto) sentencia;
Comunicación entre hilos
Veamos, por ejemplo, el problema clásico de las colas, donde uno de los hilos produce datos y otro los consume. Para que el problema sea más interesante supongamos que el productor tiene que esperar a que el consumidor haya terminado, para empezar a producir más datos. En un sistema basado en sondeo el consumidor estaría desperdiciando ciclos de CPU mientras espera a que el productor produzca. Una vez que el productor ha terminado, se queda sondeando hasta ver que el consumidor ha finalizado, y así sucesivamente. Evidentemente, hay una forma mejor de hacerlo. Java proporciona un mecanismo elegante de comunicación entre procesos, a través de los métodos wait, notify y notifyAll. Estos métodos se implementan como métodos de final en Object, de manera que todas las clases disponen de ellos. Cualquiera de los tres métodos sólo puede ser llamado desde dentro de un método synchronized.
wait: le indica al hilo en curso que abandone el monitor y se vaya a dormir hasta que otro hilo entre en el mismo monitor y llame a notify.
notify: despierta al primer hilo que realizó una llamada a wait sobre el mismo objeto.
notifyAll_: despierta todos los hilos que realizaron una llamada a wait sobre el mismo objeto. El hilo con mayor prioridad de los despertados es el primero en ejecutarse.