PDF de programación - 11 Threads - Curso De Java

Imágen de pdf 11 Threads - Curso De Java

11 Threads - Curso De Javagráfica de visualizaciones

Actualizado el 21 de Marzo del 2018 (Publicado el 20 de Enero del 2018)
625 visualizaciones desde el 20 de Enero del 2018
379,8 KB
14 paginas
Creado hace 16a (10/05/2007)
Lenguaje de Programación JAVA – 2º IINF y 2º ITIG

Lenguaje JAVA

11. Threads

300

11. Threads
La máquina virtual Java implementa un entorno que permite
a varias secuencias de instrucciones ejecutarse al mismo
tiempo. Estas secuencias se llaman threads.
La capacidad de tener varios threads o hilos de ejecución
ejecutándose simultáneamente se llama concurrencia.

David Contreras Bárcena

301

David Contreras Bárcena - ETSI

Lenguaje de Programación JAVA – 2º IINF y 2º ITIG

Lenguaje JAVA

11. Threads - Concurrencia
Los threads no se ejecutan verdaderamente al mismo
tiempo. En realidad, el interpretador Java ejecuta los threads
uno tras otro (restricción impuesta por todo sistema
monoprocesador). Esto responde a la política empleada por
el planificador del Sistema Operativo.

Thread
Thread

A
A

Ejecución...
Ejecución...

Thread
Thread

B
B

Espera del
Espera del
procesador
procesador

Espera del
Espera del
procesador
procesador

Ejecución...
Ejecución...

Ejecución...
Ejecución...

Espera del
Espera del
procesador
procesador

David Contreras Bárcena

tiempo

302

11. Threads - Ciclo de vida

Definición

new Thread()

Bloqueado

sleep()
wait()

notify()

Muerto

stop()

sleep()
wait()

start()

Ejecutable

yield()

En curso

David Contreras Bárcena

303

David Contreras Bárcena - ETSI

Lenguaje de Programación JAVA – 2º IINF y 2º ITIG

Lenguaje JAVA

11. Threads - Ciclo de vida
Definición: El thread se acaba de crear; todavía no está bajo el
planificador (scheduler).
Ejecutable: El thread está listo para ser ejecutado; se halla en la cola
del planificador del sistema operativo.
En ejecución: El thread está en ejecución hasta que sea sustituido por
otro proceso (p.e., por un algoritmmo de planificación Round Robin) o
hasta que finaliza.
Bloqueado: El thread espera un evento que le permita volver a la cola
del planificador.
Muerto: El thread deja de existir.

David Contreras Bárcena

304

11. Threads - Planificador
El planificador es el encargado de enviar al procesador los
threads según una política de prioridades.
Todos los procesos que llegan al planificador, forman parte
de una cola. El orden dentro de ésta viene dado por su
prioridad y por su instante de llegada.
En caso de tener dos procesos de igual prioridad en la cola,
ejecutará aquel que llegase primero, y posteriormente para
que el proceso no acapare todo el consumo de CPU, se
establecen políticas de rotamiento de procesos: round-robin.

David Contreras Bárcena

305

David Contreras Bárcena - ETSI

Lenguaje de Programación JAVA – 2º IINF y 2º ITIG

Lenguaje JAVA

11. Threads - Planificador
Cuando el planificador suspensde la ejecución de un thread
y pasa el control a otro:

Cuando un thread de mayor prioridad llega al planificador
Cuando el planificador decide ejecutar otro thread de la misma
prioridad (round-robin).
Cuando se produce una situación crítica (por ejemplo: deadlock) y
decide ejecutar un thread de prioridad inferior

David Contreras Bárcena

306

11. Threads - Estructura
Todo thread debe heredar de la clase Thread.
La lógica a ejecutar por el hilo se implementará dentro del método
public void run().
Al finalizar el método run el thread muere.
Este método se invocará automáticamente al realizar el start() del hilo.

public class Hilo extends Thread
{

super(nombre);

public Hilo(String nombre)
{
}
public void run()
{
}

//Lógica del hilo

}

}

}

public class App
{

public static void main(String args[])
{

Hilo h1 = new Hilo(“hilo1”);
Hilo h2 = new Hilo(“hilo2”);
h1.start();
h2.start();

David Contreras Bárcena

307

David Contreras Bárcena - ETSI

Lenguaje de Programación JAVA – 2º IINF y 2º ITIG

Lenguaje JAVA

11. Threads - Cambios de estado
Definición:

Hilo miHilo = new Hilo( );

Inicio:

miHilo.start( ); (cid:198) implícitamente se invoca el método run().

Muerte:

fin de la secuencia de ejecución del método run( )

Bloqueo de un thread :

Thread.sleep(10000);
miHilo.wait( );
espera de recurso(s)

Desbloqueo de un thread :
período de tiempo terminado
miHilo.notify( ) o miHilo.notifyAll( )
recurso(s) liberado(s)

David Contreras Bárcena

308

11. Threads - Cambios de estado

Hilo miHilo = new Hilo( );

miHilo.start();

miHilo.wait();

miHilo.notify();

Estado
ejecución
Estado
bloqueado

1000 ms

Thread.sleep(1000);

Entra en el método

run() del hilo

Sale del método
run() del hilo

David Contreras Bárcena

309

David Contreras Bárcena - ETSI

Lenguaje de Programación JAVA – 2º IINF y 2º ITIG

Lenguaje JAVA

11. Threads – Finalizar un hilo
Se pueden tener dos tipos de ejecuciones dentro de un hilo:

Secuencial: Se realiza un proceso lineal paralelo al programa
principal. Al ejecutar la última línea de código finaliza el hilo. P.e:
Proceso de impresión en Word.
Iterativo: Se repite el proceso durante toda la ejecución del
programa principal. P.e: Un reloj que se actualiza cada segundo.
Para controlar la finalización del hilo en el segundo caso, se
trabajará con una variable booleana. No se deberá utilizar
el método stop() de la clase
Thread (forma insegura).

public class Hilo extends Thread
{

public void run()
{

while(!fin)
{
}

//Lógica del hilo

310

super(nombre);

private boolean fin = false;
public Hilo(String nombre)
{
}
public void finalizar()
{
}

fin = true;

}
David Contreras Bárcena

}

11. Threads - Prioridades
Las prioridades se establecen de 1 a 10 a través del método
setPriority(int).
También existen constates definidas en la clase Thread que definen la
prioridad máxima, mínima y normal:

MIN_PRIORITY, NORMAL_PRIORITY y MAX_PRIORITY

La forma de suspender externamente (por el programador) un proceso
de su ejecución es a través de la invocación del método yield().

David Contreras Bárcena

311

David Contreras Bárcena - ETSI

Lenguaje de Programación JAVA – 2º IINF y 2º ITIG

Lenguaje JAVA

11. Threads – Acceso concurrente a métodos
Es una de las dificultades de la utilización de threads.
Cuando más de un thread esta intentando modificar los
mismos datos a la vez, el resultado puede ser inconsistente.

class Ipc
{

int sueldo;
..
void incrementaIPC()
{
sueldo*=1.03;
}

}

}

David Contreras Bárcena

312

11. Threads – Acceso concurrente a métodos
La solución es impedir que dos threads ejecuten
simultáneamente el mismo método.
Esto se consigue gracias al modificador synchronized.

class Ipc
{

int sueldo;
..
synchronized void incrementaIPC()
{
}

sueldo*=1.03;

David Contreras Bárcena

313

David Contreras Bárcena - ETSI

Lenguaje de Programación JAVA – 2º IINF y 2º ITIG

Lenguaje JAVA

11. Threads - Ejemplo

public class Corredor extends Thread
{

public static void main(String e[])
{

Corredor c1= new Corredor(“Corredor A");
Corredor c2= new Corredor("Corredor B");
c1.setPriority( Thread.MIN_PRIORITY );
c2.setPriority( Thread.MAX_PRIORITY);
c1.start();
c2.start();

}
public Corredor (String str)
{
}
public void run()
{

super(str);

for (int i = 0; i < 10; i++)
{

System.out.println(i + " " + this.getName());
try
{
}
catch (InterruptedException e) {}

Thread.sleep((long)(Math.random() * 1000));

}
System.out.println("Terminó! " + this.getName());

}

}

David Contreras Bárcena

314

11. Threads – Interface Runnable
Hasta ahora la forma de trabajar con hilos era heredando de
la clase Thread.
Cuando una clase ya hereda de otra (p.e. JFrame) y se
desea trabajar con hilos de ejecución, la solución es
implementar el interface Runnable.
Runnable no define el comportamiento de un hilo, sino la
capacidad de que una clase implemente el método run.
Paralelamente a esto, se deberá crear una ocurrencia de la
clase Thread, índicando a través del constructor
Thread(Runnable), que el método run de este hilo lo
implementará nuestra clase del tipo Runnable.

David Contreras Bárcena

315

David Contreras Bárcena - ETSI

Lenguaje de Programación JAVA – 2º IINF y 2º ITIG

Lenguaje JAVA

11. Threads – Ejemplo de Runnable

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TiraDados extends JFrame implements Runnable
{

private volatile JTextField txtAleatorio = new JTextField (1);
private JButton btnIniciar = new JButton ("Lanzar");
private JButton btnDetener = new JButton ("Parar");
private Thread hiloAleatorio;
private boolean fin = false;
public static void main(String s[])
{
}
public TiraDados ()
{

new TiraDados();

this.getContentPane().setLayout(new FlowLayout());
this.getContentPane().add(txtAleatorio);
this.getContentPane().add(btnIniciar);
this.getContentPane().add(btnDetener);
btnDetener.setEnabled(false);

……

Modificador volatile: es aconsejable declarar de esta manera los

objetos manipulados por más de un hilo

David Contreras Bárcena

316

11. Threads – Ejemplo de Runnable

btnIniciar.addActionListener(new ActionListener()
{

public void actionPerformed(ActionEvent e)
{

fin = false;
btnDetener.setEnabled(true);
btnIniciar.setEnabled(false);
hiloAleatorio = new Thread (TiraDados.this);
hiloAleatorio.start();

});
btnDetener.addActionListener(new ActionListener()
{

public void actionPerformed(ActionEvent e)
{

btnDetener.setEnabled(false);
btnIniciar.setEnabled(true);
fin = true;

}

}

});
this.addWindowListener(new WindowAdapter()
{

public void windowClosing(WindowEvent e)
{

fin = true;
TiraDados.this.dispose();
System.exit(0);

}

});

David Contreras Bárcena

317

David Contreras Bárcena - ETSI

Lenguaje de Programación JAVA – 2º IINF y 2º ITIG

Lenguaje JAVA

11. Threads – Ejemplo de Runnable

this.pack();
this.setVisible(true);

}
public void run()
{

while(!fin)
{

try
{

Thread.sleep(1000);
int a = (int) (Math.random()*6) + 1;
txtAleatorio.setText(String.valueOf(a));

}
catch(InterruptedException e)
{
}

}

}

}

David Contreras Bárcena

318

11. Threads – Wait y Notify
Establecen un mecanismo seguro para detener y recuperar
la ejecución del thread.
No se deberá hacer uso de los métodos suspend() o
resume().
Los dos métodos deben ejecutarse en fragmentos de código
synchronized. Esto se puede hac
  • Links de descarga
http://lwp-l.com/pdf8387

Comentarios de: 11 Threads - Curso De Java (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad