Está en la página 1de 19

Departamento de Ingeniera del Software e Inteligencia Artificial

Universidad Complutense de Madrid


Hebras
Tecnologa de la Programacin. Curso 2013/14
Guillermo Jimnez Daz
Motivacin
Ejemplo: Nuestra prctica
La ventana se queda colgada y se presentan el estado de la
pila, el panel de entrada y de salida de golpe
Razn: Cuando swing avisa al listener no hay nadie que se
quede a la espera del resto de eventos de la ventana o del
repintado de la misma
Tecnologa de la Programacin
Procesos y hebras
Unidades bsicas de ejecucin en programacin concurrente
Permiten la ejecucin en paralelo de dos o ms bloques de
cdigo
Simulacin de ejecucin simultnea
Diferencia principal:
Un proceso dispone de su propio espacio de memoria,
independiente del espacio del resto de los procesos lanzados
Si un proceso quiere comunicarse con otro (o acceder a su
memoria) deber realizarlo a travs del sistema operativo
Sockets, tuberas, espacios de memoria compartida
Un thread puede verse como caminos de ejecucin distintos
dentro de un proceso
Comparten memoria por lo que pueden trabajar con el mismo
objeto a la vez (con el peligro que conlleva si no se programan
bien)
Mecanismos de sincronizacin
Tecnologa de la Programacin
Hebras en J ava 1: extender la clase Thread
Tecnologa de la Programacin
class MiHebra extends Thread {
private int num;
public MiHebra(int constante) {
this.num = constante;
}
public void run() {
while (true) {
System.out.print(num);
}
}
public static void main(String []args) {
new MiHebra(0).start();
new MiHebra(1).start();
}
}
Hebras en J ava 2: Implementar la interfaz Runnable
Tecnologa de la Programacin
class MiHebra2 implements Runnable {
private int num;
public MiHebra2(int constante) {
this.num = constante;
}
public void run() {
while (true) {
System.out.print(num);
}
}
public static void main(String []args) {
new Thread(new MiHebra2(0)).start();
new Thread(new MiHebra2(1)).start();
}
}
Planificacin de hebras
La J VM posee un planificador responsable de decidir en qu momento
se ejecuta cada hebra
Cuntos milisegundos se da a cada hebra
Cundo se la expropia
El programador puede realizar ciertas operaciones para controlar la
ejecucin de las hebras, como establecer prioridades
setPriority y getPriority
MIN_PRIORITY(=1) , MAX_PRIORITY(=10), NORM_PRIORITY (=5)
Si varias hebras tienen igual prioridad entonces todas se ejecutan en algn
momento
Tecnologa de la Programacin
Mtodos de manipulacin de hebras
Se puede suspender temporalmente la ejecucin de una hebra
Thread.sleep(milisegundos)
Se puede interrumpir (detener) la ejecucin de una hebra
miObjetoHebra.interrupt()
Se puede esperar a la finalizacin de otra hebra
miObjetoHebra.join(milisegundos)
El programador es responsable de controlar y decidir qu hacer
cuando se solicita la interrupcin de una hebra
Encuesta o polling: Thread.interrupted()
Excepcin lanzada por algunos mtodos de Thread:
InterruptedException
Tecnologa de la Programacin
Ejemplo
Tecnologa de la Programacin
public class HebraMensaje implements Runnable{
private int n;
private String msg;
public HebraMensaje(String msg){
this.msg=msg;
this.n =0;
}
@Override
public void run(){
try{
while(true){
if (n<msg.length()){
System.out.print(msg.charAt(n));
n++;
}
else n=0;
Thread.sleep(500);
}
}catch(InterruptedException e){
System.out.println("Hebrainterrumpida!!!");
}
}

Ejemplo
Tecnologa de la Programacin
publicstaticvoidmain(String[]args){
Threadt=newThread(newHebraMensaje("Pocoapoco."));
t.start();
try{
t.join(5000);
t.interrupt();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
Sincronizacin
Hebras comparten acceso a objetos y atributos por lo que se pueden
producir
Interferencias entre hebra
Errores de consistencia de memoria
Excepciones al intentar acceder simultneamente al mismo elemento
Para resolver esto se utilizan:
Mecanismos de sincronizacin:
Mtodos synchronized
Instrucciones syncronized
Declarar variables volatile
Clases para implementar mecanismos de concurrencia
java.util.concurrent
Se deja para asignaturas sobre Programacin Concurrente
Tecnologa de la Programacin
Hebras y Swing
Hebra especial para Swing: Event Dispatch Thread
Para la captura y manipulacin de eventos
Swing Toolkit mete los eventos de los componentes en una cola
de eventos
Los componentes Swing solo son manipulados por EDT ya que no
son seguros ante hebras
Tecnologa de la Programacin
Hebras y Swing
Dos reglas fundamentales
Manipular siempre los componentes de Swing desde la EDT
Nunca suspender o bloquear la EDT
Reglas derivadas
Toda tarea que se realice en un Listener ha de ser instantneo
Toda tarea larga que se realice en un Listener ha de enviarse a
una hebra nueva
Si es necesario actualizar algn componente de Swing se ha de
realizar desde la EDT (por lo que solo el cdigo de actualizacin de
la nueva hebra ha de ejecutarse en la hebra de Swing)
Manipular los componentes de Swing implica tambin manipular
los objetos auxiliares (modelos) que pueden disparar eventos en la
hebra de Swing
Tecnologa de la Programacin
Hebras y Swing
Problema: Cmo ejecutar cdigo de actualizacin de Swing
desde otra hebra?
Solucin: Creamos un evento especial que guarda la tarea
que queremos que se ejecute de manera segura en la EDT
SwingUtilities.invokeLater(Runnable)
Ejecuta de manera asncrona la hebra cuando termine de
procesar los eventos pendientes en la EDT
SwingUtilities.invokeAndWait(Runnable)
Ejecuta de manera sncrona (espera a que termine de
ejecutarse) la hebra cuando termine de procesar los eventos
pendientes en la EDT
Puede bloquear la EDT
No es recomendable que se llame desde la EDT
Tecnologa de la Programacin
Hebras y Swing
Tecnologa de la Programacin
publicvoidactionPerformed(ActionEventarg0){
Threadworker=newThread(){
publicvoidrun(){
for(inti=0;i<=10;i++){
finalintcount=i;
SwingUtilities.invokeLater(newRunnable(){
publicvoidrun(){
countLabel1.setText(Integer.toString(count));
}
});
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){}
}
SwingUtilities.invokeLater(newRunnable(){
publicvoidrun(){
statusLabel.setText("Completed.");
}
});
}
};
worker.start();
}
Hebras y Swing
Desde J ava 1.6 se simplifica la tarea anterior usando las hebras worker
o de background para ejecutar tareas que tardan tiempo en
completarse
Para crearlas se usa la clase abstracta SwingWorker<T,V>
T es el tipo devuelto por doInBackground y mtodos get
V es el tipo utilizado por los mtodos publish y process
Mtodos para implementar/redefinir
T doInBackground(): Tarea larga que no se ejecuta en la EDT. Si quiere
notificar el estado de la tarea en Swing usar el mtodo publish(V)
process(List<V>): Se ejecuta en la EDT y sirve para notificar el estado de
la tarea. El parmetro contiene todos los valores publicados por
doInBackground
done(): Se ejecuta en la EDT una vez que finaliza el mtodo
doInBackground.
Tecnologa de la Programacin
Hebras y Swing
Tecnologa de la Programacin
public void actionPerformed(ActionEvent arg0){
SwingWorker<Void,Integer>worker =newSwingWorker<Void,Integer>(){
@Override
protected Void doInBackground()throws Exception {
for (int i=0;i<=10;i++){
Thread.sleep(1000);
publish(i);
}
return;
}
protected void done() {
statusLabel.setText("Completed.");
}
@Override
protected void process(List<Integer>chunks){
int mostRecentValue =chunks.get(chunks.size()1);
countLabel1.setText(Integer.toString(mostRecentValue));
}
};
worker.execute();
}
Hebras y Swing
Para obtener el resultado de doInBackground desde el mtodo
done() se usa T get()
Para cancelar la ejecucin de un SwingWorker usamos el
mtodo cancel()
Desde doInBackground se revisar peridicamente si ha sido
interrumpida con isCancelled()
Podemos registrar Listeners de cambios del estado de algunas
variables propias de SwingWorker
progress: Estado de la ejecucin de la tarea (de 0 a 100). Se
actualiza con setProgress
state: Estado de la tarea (PENDING, STARTED, DONE)
SwingWorker est pensado para ser ejecutado una nica vez
Ejecutar dos veces execute NO implica ejecutar dos veces
doInBackground
Tecnologa de la Programacin
Ms informacin
Hebras en J ava
http://docs.oracle.com/javase/tutorial/essential/concurrency/
Concurrencia en Swing
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/
Mtodos obsoletos en Hebras en J ava
http://docs.oracle.com/javase/8/docs/technotes/guides/concurren
cy/threadPrimitiveDeprecation.html
Tecnologa de la Programacin
Conclusions
Tecnologa de la Programacin

También podría gustarte