Documentos de Académico
Documentos de Profesional
Documentos de Cultura
en Java
Contenido
– Creación de Hebras
• La clase Thread
• La interfaz runnable
• Hebras como objetos autónomos
• Paso de parámetros
• Finalización
• Estados de una hebra
• Prioridades
• Ejemplos
– Sincronización en Java
z Un Proceso
– Contiene su propio espacio virtual de direcciones
• Es distinto para cada proceso
– Contiene una o más hebras (threads) de ejecución
• La hebra es la unidad básica de ejecución
• Las hebras se planifican siguiendo criterios clásicos
– disponibilidad de recursos
– prioridades
– justicia
• Cada hebra tiene su propia pila, variables locales y
contador de programa
• Los cambios de contexto son muy rápidos
Introducción
– Creación
Thread th;
th = new Thread ();
Creación de hebras
class HerenciaThread extends Thread {
String m_palabra; // palabra a imprimir
int m_pausa; // duración de la pausa
t1.start();
t2.start();
}
}
Departamento de Lenguajes y Ciencias de la Computación.
9
Universidad de Málaga
public AutoThread()
{ me = new Thread(this);
me.start(); }
Finalización
z Suspensión de un thread:
– suspend()
– resume()
z Comprobación de terminación
– isAlive()
Prioridades
z Ejecución del thread de mayor prioridad
– Ejecución de threads de menor prioridad por bloqueos
z Prioridad inicial: la misma que el objeto que crea el thread
z Cambio de prioridad: setPriority()
– Valores entre MIN_PRIORITY y MAX_PRIORITY
– Valor por defecto: NORM_PRIORITY
v= new compartida(2);
s = new sumador[2];
public compartida() {
valor = 0;
}
// Inicialización
filas=...; columnas=...;
a=new int[filas][columnas];
b=new int[filas][columnas];
resul=new int[filas][columnas];
...
// Crear hebras sumadoras de filas
sumafila s[]=new sumafila[filas];
for (f=0;f<filas;f++) {
s[f]=new sumafila(a[f],b[f]);
s[f].start();
}
// Esperar la terminación e imprimir resultado...
}}
– Creación de Hebras
– Sincronización en Java
• Exclusión mutua en Java
• Métodos sincronizados
• La sentencia synchronized
• Comunicación entre hebras: wait y notify
• Ejemplo del buffer acotado
• Problema de los filósofos
• Lectores-Escritores
• Herencia y sincronización
Hebra A
synchronized
Hebra B synchronized
No synchronized
Hebra C
Métodos sincronizados
La sentencia synchronized
z Ej: sacar dinero en cajero
Cuenta c;
synchronized (c) {
if (c.haySaldo(cantidad))
c.sacarDinero(cantidad);
}
C D
cima P
C
P
Departamento de Lenguajes y Ciencias de la Computación.
31
Universidad de Málaga
Buffer (int i) {
cima = 0;
capacidad = i;
vector = new int[i];
}
vector[cima]=elem;
cima++;
notifyAll(); // Ya hay elementos producidos
}
}
z Problemas:
– Si todos los filósofos cogen un tenedor:
• ¡Interbloqueo!
– Evitar injusticias:
• Que todos tengan las mismas posibilidades de comer
z Solución propuesta:
– Una clase “controladora” almacena el número de
tenedores disponibles para cada filósofo
– Sólo se permite comer si se tienen los dos tenedores
disponibles.
• Al menos un filósofo podrá comer
• Todos tienen las mismas posibilidades para comer
// MODIFICAR VECINOS
sig=(id+1) % n; ant=id-1;
if (ant<0)
ant=n-1;
tenedor[sig]--;
tenedor[ant]--;
}
Departamento de Lenguajes y Ciencias de la Computación.
42
Universidad de Málaga
// INICIALIZA FILOSOFOS
f=new filosofo[5];
for (int cont=0;cont<5;cont++)
f[cont]=new filosofo(cont,c);
// COMIENZA FILOSOFOS
for (int cont=0;cont<5;cont++)
f[cont].start();
}
}
}
Solución ineficiente, todas las hebras son despertadas
Departamento de Lenguajes y Ciencias de la Computación.
48
Universidad de Málaga
z Solución 2:
– Objetivo: reducir el número de hebras despertadas
innecesariamente
z Aproximación:
– Utilizar otra clase junto con sincronización de bloques
– Obtener el cerrojo de una variable de condición sobre la
que se querría dormir o despertar y después obtener el
cerrojo para la clase LectoresEscritores
BufferCircularSeguro(int longitud)
{
super(longitud);
prohibido = false;
}
z Problema:
– Sentencias wait y notify de los nuevos put y get interfieren
con los de la clase padre: es necesario modificar la clase
padre
public synchronized void put(int item) throws InterruptedException
{
while (cuantos == medida) {
wait();
};
ultimo = (ultimo + 1) % medida;
cuantos++;
buffer[ultimo] = item;
notifyAll();
};