Un hilo (thread) es un flujo de control secuencial dentro de un programa, o con otras palabras, es un proceso en ejecución dentro de un programa. (Horstmann S. & Cornell, 2006) Hilos e interrupciones ¡No se puede parar la ejecución de un hilo desde fuera! (En realidad sí, pero se desaconseja (métodos obsoletos)…) • Para parar un hilo de ejecución, tenemos que solicitárselo mediante interrupt(), y confiar en que nos hará caso. • El hilo debería comprobar periódicamente si lo quieren parar. • Algunos métodos de la librería de Java Estados de los hilos generan una excepción si durante su ejecución se les intenta interrumpir (como es el caso de sleep()) Cuando se crea un hilo con el operador new el • Así se comprueba si nos han mandado una hilo todavía no esta en ejecución. Esto interrupción: Nuevo significa que se halla en el estado nuevo. Cuando el hilo esta en estado nuevo, el - Thread.interrupted() programa todavía no ha empezado a ejecutar • Así se comprueba si otro hilo ha recibido Una vez invocado al método start, el hilo es el código que contiene. una interrupción: ejecutable. Un hilo ejecutable puede estar - isInterrupted() Ejecutable ejecutándose realmente, o no. Es cuestión del sistema operativo dar tiempo al hilo para que Un hilo entra en el estado bloqueado cuando se ejecute. se produce una de las acciones siguientes: (Eckel, 2007) • El hilo se duerme llamando al método Bloqueado sleep. • El hilo llama a una operación que se Los hilos mueren por una de estas dos bloquea por entrada-salida, esto es, razones: una operación que no retornará a • Fallecen de muerte natural cuando el Muerto quien la haya invocado. método run concluye normalmente. • Fallecen de forma inesperada cuando hay una excepción sin capturar que Propiedades de los hilos causa la conclusión del método run. (Horstmann S. & Cornell, 2006) Las propiedades más interesantes de la clase Thread son: • Name: permite darle un nombre a un thread que los distinga del resto. Sincronización • CurrentThread: contiene una referencia al thread que esta actualmente en ejecución. Puntos clave con la sincronización y el seguro de los objetos: • ApartmentState: obtiene o establece el estado de apartamento de este subproceso. Solo métodos (o bloques) pueden ser sincronizados, nunca una variable o clase. Cada objeto tiene solamente un seguro. • CurrentContext: obtiene el contexto actual donde se esta ejecutando el subproceso. Si una clase tiene ambos tipos de • CurrentCulture: obtiene o establece la referencia cultural del No todos los métodos de una clase deben métodos, múltiples hilos pueden acceder a subproceso actual. ser sincronizados, una misma clase puede sus métodos no sincronizados, el único tener métodos sincronizados y no • CurrentPrincipal: obtiene la entidad de seguridad actual del código protegido es aquel dentro de un subproceso. sincronizados. método sincronizado. • CurrentUICulture: establece la referncian cultural actual utilizada Si un hilo pasa a estado dormido(sleep) no por el administrador de recursos para buscar recursos específicos Se puede sincronizar un bloque de código libera el o los seguros que pudiera llegar a de la referencia cultural en tiempo de ejecución. en lugar de un método. tener, los mantiene hasta que se completa. • ExecutionContext: obtiene un objeto que contiene información sobre los distintos contextos del subproceso actual. • IsAlive: obtiene un valor que indica el estado de ejecución del subproceso actual.
En cualquier momento en el que dos o más threads acceden
al mismo objeto o bloque de código. Aplicaciones de los hilos • Cajero ATM: la atención hacia los clientes no es suficiente, es por ello que se colocan mas de 1 cajero automático. • Semáforo: es manejado por un thread y por temporizadores.
Sobresincronizar causa retrasos innecesarios, cuando dos
o más threads no tratan de ejecutar el mismo bloque de código.