Programacion Hilos en JAVA

Definición de Hilo en JAVA

Es el flujo secuencial dentro de un programa.

Cada hilo tiene:

  • Un comienzo

  • Una secuencia

  • Un final

  • En cada instante concreto solo hay un único punto de ejecución.

  • Los hilos no son programas porque no pueden ser ejecutados por ellos mismos, solo es posible hacerlo dentro de un programa .

  • Por eso un hilo es:

      • Un flujo de control secuencial simple dentro de un programa.

Tenemos diferentes clases

  • Timer para planificar la ejecucion de diferentes tareas

  • Timer Task tareas que pueden planificar.

Estados de un Hilo

Estado Nuevo

El Thread ha sido creado pero no inicializado, es decir, no se ha ejecutado todavía el método start(). Se producirá un mensaje de error (IllegalThreadStateException) si se intenta ejecutar cualquier método de la clase Thread distinto de start().

Estado Ejecutable

El Thread puede estar ejecutándose, siempre y cuando se le haya asignado un determinado tiempo de CPU. En la practica puede no estar siendo ejecutado en un instante determinado en beneficio de otro thread.

Estado Bloqueado

El Thread podría estar ejecutándose, pero hay alguna actividad interna suya que lo impide, como por ejemplo una espera producida por una operación de escritura o lectura de datos por teclado (E/S). Si un Thread esta en este estado, no se le asigna tiempo de CPU.

Estado Muerto

La forma habitual de que un Thread muera es finalizando el método run(). También puede llamarse al método stop() de la clase Thread, aunque como ya mencionamos, dicho método es considerado “peligroso” y no debe utilizarse

Librerías y clases. Ejemplos

La forma más directa para hacer un programa multi-thread es extender la clase Thread, y redefinir el método run(). Este método es invocado cuando se inicia el thread (mediante una llamada al método start() de la clase thread). El thread se inicia con la llamada al método run y termina cuando termina éste. El ejemplo ilustra estas ideas:

public class ThreadEjemplo extends Thread {
public ThreadEjemplo(String str) {
super(str);
}
public void run() {
for (int i = 0; i < 10 ; i++)
System.out.println(i + ” ” + getName());
System.out.println(“Termina thread ” + getName());
}
public static void main (String [] args) {
new ThreadEjemplo(“Pepe”).start();
new ThreadEjemplo(“Juan”).start();
System.out.println(“Termina thread main”);
}
}

Compila y ejecuta el programa. La salida, será algo asi:

Termina thread main
0 Pepe
1 Pepe
2 Pepe
3 Pepe
0 Juan
4 Pepe
1 Juan
5 Pepe
2 Juan
6 Pepe
3 Juan
7 Pepe
4 Juan
8 Pepe
5 Juan
9 Pepe
6 Juan
Termina thread Pepe
7 Juan
8 Juan
9 Juan
Termina thread Juan

Ejecuta varias veces el programa. Verás que no siempre se ejecuta igual. 

La clase principal para conseguir

concurrencia en Java es la clase Thread

Dispone de un método start() que ocasiona la

ejecución del código que tenga dentro de su

método run() en un nuevo hilo

Todos los hilos se ejecutan en la misma

máquina virtual (mismo proceso)

Por tanto comparten recursos, como la memoria

En realidad sólo puede haber un hilo ejecutándose

a la vez (se alternan, gracias a la concurrencia)

Gestión de hilos

Un hilo de ejecución, en los sistemas operativos, es similar a un proceso en que

ambos representan una secuencia simple de instrucciones ejecutada en paralelo con

otras secuencias. Los hilos permiten dividir un programa en dos o más tareas que corren

simultáneamente, por medio de la multiprogramación. En realidad, este método permite

incrementar el rendimiento de un procesador de manera considerable. En todos los

sistemas de hoy en día los hilos son utilizados

Sincronización

El hecho de que varios hilos compartan el mismo espacio de memoria puede causar dos

problemas

1. Interferencias

2. Inconsistencias

Algunos hilos necesitan esperar a otros para disponer de datos importantes o evitar problemas de acceso simultáneo a recursos

Java proporciona mecanismos de sincronización de hilos para tratar estos problemas

Cuando dos o más hilos son interdependientes, deben decidir entre ellos cuándo esperar y cuándo avanzar

Sistema de parada y avance

Cuando un hilo A depende de que otro B complete una

tarea, se para a esperar

Cuando el hilo B completa su tarea, B avisa a A para que continúe su ejecución

Implementación incorrecta: espera “activa”

public void esperaCondicion ( ) {

while ( !condicion ) { //No hacer nada }

// Seguir ejecutando…

}

Bibliografía

http://web.fdi.ucm.es/profesor/fpeinado/courses/oop/LPS-17Hilos.pdf

http://bibing.us.es/proyectos/abreproy/11320/fichero/Capitulos%252F13.pdf

http://www.arrakis.es/~abelp/ApuntesJava/Threads.htm

psp-trabajohilos

Anuncios

Publicado el 28 septiembre, 2016 en Programacion de Servicios. Añade a favoritos el enlace permanente. Comentarios desactivados en Programacion Hilos en JAVA.

Los comentarios están cerrados.

A %d blogueros les gusta esto: