// TAREA 02
Sinchronized y Unsinchronized + ventana modal hijo
Synchronized Lectores Escritores
System.out.println("Método " + Thread.currentThread().getStackTrace()[1].getMethodName());
// R14 Hilo Principal
Thread miHilo = Thread.currentThread();
miHilo.getName(); //En el main, el nombre es main
// R18 Crear Hilo Thread
public class Saludo extends Thread {
//clase que extiende a Thread
@Override
public void run() {
// se redefine el método run() con el código asociado al hilo
System.out.println("¡Saludo desde un hilo extendiendo thread!");
}
public static void main(String args[]) {
Saludo hilo1=new Saludo();
//se crea un objeto Thread, el hilo hilo1
hilo1.start();
//invoca a start() y pone en marcha el hilo hilo1
}
}
// R22 Crear Hilo Runnable
public class Saludo implements Runnable {
//clase que implementa a Runnable
public void run() {
//se redefine el método run()con el código asociado al hilo
System.out.println("¡Saludo desde un hilo creado con Runnable!");
}
public static void main(String args[]) {
Saludo miRunnable=new Saludo();
//se crea un objeto Saludo
Thread hilo1= new Thread(miRunnable);
//se crea un objeto Thread (el hilo hilo1) pasando como argumento
// al constructor un objeto Saludo
hilo1.start();
//se invoca al método start() del hilo hilo1
}
}
// R27 Ejecutar Varios hilos
public class Main {
public static void main(String[] args) {
//creamos 2 hilos del tipo Hilo_Thread con 2 constructores
//diferentes
Thread hilo1 = new Hilo_Thread("Isabel");
Thread hilo2 = new Hilo_Thread();
//creamos un hilo Runnable en un paso
Thread hilo3 = new Thread(new Hilo_Runnable());
//ponemos en marcha los 3 hilos
hilo1.start();
hilo2.start();
hilo3.start();
}
}
//CLASE APARTE
public class Hilo_Thread extends Thread {
//clase que extiende a Thread con 2 constructores
String nombre = "Hilo_derviaThread";
public Hilo_Thread(String nb) {
//constructor 1
nombre = nb;
}
public Hilo_Thread() {
//constructor 2
}
@Override
public void run() {
//redefinimos run() con el código asociado al hilo
for (int i = 1; i <= 5; i++) {
System.out.println(nombre);
}
}
}
//CLASE APARTE
public class Hilo_Runnable implements Runnable {
//clase que implementa Runnable
public void run() {
//redefinimos run() con el código asociado al hilo
for (int i = 1; i <= 5; i++) {
System.out.println(" Hilo_Runnable");
}
}
}
// R30 Estado Hilo
hilo1.getState() | hilo1.isAlive() |
hilo1.start() |hilo1.join(); //esperar a que muera
// Se crea y etsña new y no alive. Con start está runnable y alive Muerto: terminated noAlive
public static void main(String[] args) {
Hilo_Auxiliar hilo1 = new Hilo_Auxiliar();
//Crea un nuevo hilo. El hilo está en estado Nuevo (new)
System.out.println("Hilo Auxiliar Nuevo: Estado=" + hilo1.getState()
+ ",¿Vivo? isAlive()=" + hilo1.isAlive());
//Obtenemos el estado del thread hilo1 y si está vivo o no
hilo1.start();
//Inicia el thread hilo1 y pasa al estado Ejecutable
System.out.println("Hilo Auxiliar Iniciado: Estado="
+ hilo1.getState()
+ ",¿Vivo? isAlive()=" + hilo1.isAlive() + "\n");
try {
hilo1.join();
//espera a que el thread hilo1 muera
} catch (InterruptedException e) {
System.out.println(e);
}
System.out.println("\n Hilo Auxiliar Muerto: Estado="
+ hilo1.getState()
+ ",¿Vivo? isAlive()=" + hilo1.isAlive());
}
public class Hilo_Auxiliar extends Thread{
//código del hilo
@Override
public void run(){
for(int i=10;i>=1;i--)
System.out.print(i+",");
}
}
// R32 DORMIR HILO
this.sleep(1000);
//CON UN HILO AUXILIAR SIN DORMIR
Thread thIzquierdo = new Hilo_Auxiliar(false, marcador);
//crea un hilo pasándole como argumento el marcador pero el duerme como falso ! cuenta muy rápido
thIzquierdo.start();
//CON UN HILO AUXILIAR DORMIDO
Thread thIzquierdo = new Hilo_Auxiliar(true, marcador);
//crea un hilo pasándole como argumento el marcador
thIzquierdo.start();
//Clase Hilo
public class Hilo_Auxiliar extends Thread {
//clase que hereda de Thread
JPanel_Marcador mi_marcador;
//marcador local
boolean duerme;
//variable para controlar si dormimos o no al hilo
//COnstructor donde le pasamos el parametro duerme y el marcador
public Hilo_Auxiliar(boolean d, JPanel_Marcador marcador) {
//constuctor del hilo
duerme = d;
mi_marcador = marcador;
//almacena el marcador recibido
}
@Override
public void run() {
//código del hilo
mi_marcador.valor = 0;
//anula la cuenta
mi_marcador.repaint();
//solicita el repintado para borrar el marcador
if (duerme) {
for (int i = 1; i <=20; i++) {
//incremental la cuenta
mi_marcador.valor = i;
mi_marcador.repaint();
//solicita el repintado
try {
this.sleep(100);
//duerme el hilo actual durante 1 décima de segundo, para
//que la petición de repintado del marcador sea atendida
} catch (InterruptedException ex) {
}
}
} else {
for (int i = 1; i <= 20; i++) {
//incremental la cuenta
mi_marcador.valor = i;
mi_marcador.repaint();
//solicita el repintado
}
}
}
}
// R36 Prioridades hilos
yield() problem : Thread.yield();, This.yield()
public class Hilo extends Thread {}
public Hilo(int prioridad) {this.setPriority(prioridad);}
int contador = 5;
//vectores para hilos de distintas prioridades
Thread[] hiloMIN = new Thread[contador];
Thread[] hiloNORM = new Thread[contador];
Thread[] hiloMAX = new Thread[contador];
//Constructores con y sin valores
hiloMIN[i] = new Hilo(Thread.MIN_PRIORITY); //new Hilo(); new Hilo(Thread.MAX_PRIORITY); Constru
hiloMIN[i].start();
hiloNORM[i].start();
hiloMAX[i].start();
//yield()sugiere al planficador Java que puede seleccionar otro hilo
//this.getPriority() obtener la prioridad de un hilo
// R39 Posible Hijo Egoista
public class Main {
public static void main(String[] args) {
//se crean dos hilos: hrojo y hazul
Color hrojo = new Color ("Rojo");
Color hazul = new Color ("Azul");
//se inician los hilos para su ejecución
hrojo.start();
hazul.start();
}
}
public class Color extends Thread {
//clase que extiende a Thread
String color;
public Color (String c){
color=c;
}
public void run(){
//se imprime 100 veces el valor de: color + i
for(int i=1;i<=100;i++)
System.out.println(color + i);
yield(); //llamada a yield() mejor con Thread.yield() o This.yield()
}
}
// R46 Problema Jardines
Comparten un recurso pero no se actualiza correctamente entran y salen pero las cuentas no van.
// R50JardinesSincronizado
Hacer los métodos synchronized del recurso. Recurso Jardin
public class RecursoJardin_S {
//clase que simula las entradas y las salidas al Jardín
private int cuenta; //para contar las entradas y salidas al Jardín
public RecursoJardin_S() {
cuenta = 100; //inicalmente hay 100 personas en le jardín
}
public synchronized void incrementaCuenta() {
//método que increamenta en 1 la varibale cuenta
System.out.println("hilo " + Thread.currentThread().getName()
+ "----- Entra en Jardín");
//muestra el hilo que entra en el método
cuenta++;
System.out.println(cuenta + " en jardín");
//cuenta cada acceso al jardín y muestra el número de accesos
}
public synchronized void decrementaCuenta() {
//método que decrementa en 1 la varibale cuenta
System.out.println("hilo " + Thread.currentThread().getName()
+ "----- Sale de Jardín");
//muestra el hilo que sale en el método
cuenta--;
System.out.println(cuenta + " en jardín");
//cuenta cada acceso al jardín y muestra el número de accesos
}
}
// R55 Jardines sincronizando segmentos
Dentro del thread:sincronizamos Jardin
@Override
public void run() {}
synchronized (jardin) { //segmento sincronizado
jardin.incrementaCuenta();
}
synchronized (jardin) {//segmento sincronizado
jardin.decrementaCuenta();
//invoca al método que decrementa la cuenta de accesos al jardín
}
//en vez de:
@Override
public void run() {
jardin.incrementaCuenta();
}
// R59 Lectores Escritores SEMAFORO
wait();
Si entra y hay alguien se espera con wait().
Comparten Semáforo
public final static int LIBRE = 0;
//indica que no hay lectores leyendo, ni ningún escritor escribiendo.
//En este estado pueden entrar lectores a leer, o un escritor a escribir
public final static int CON_LECTORES = 1;
//constante que indica que hay lectores leyendo. Puede entrar un nuevo
//lector a leer, pero no puede entrar ningún escritor a escribir
public final static int CON_ESCRITOR = 2;
//constante que indica que hay escritores escribiendo. En este estado, no
//puede entrar ningún lector a leer, ni nigún escritor a escribir
private int estado = LIBRE;
//estado del semáforo (inicialmente: libre)
private int tLectores = 0;
// R60 INTERBLOQUEO EJEMPLO Deadlock
cada metodo u objeto llama a otro que está synchronized
a.metodoA(this);
b.metodoB(this);
// R61 Semaphore ejemplo 1
private Semaphore
semaforo.acquire();
semaforo.release();
yield();
// R61 Semaphore ejemplo 2
Semaphore sema = new Semaphore(5);
semaforo.acquire();
semaforo.release();
El semaforo permite 5 al mismo tiempo.
Si no se puede
// R64 Exchanger Ejemplo
Intercambian datos, productor y consumidor
// R66CountDownLatch
Not there
// R68 Cyclic Barrier
// R71 Executor Ejemplo
Pool de hilos
public static void main(String[] args) {
//define un pool fijo de dos hilos
ExecutorService executor = Executors.newFixedThreadPool(2);
//pasa 30 tareas NumerosAleatorios al pool de 2 hilos
for (int i = 1; i <= 30; i++) {
executor.submit(new NumerosAleatorios());
}
//ordena la destrucción de los dos hilos del pool cuando hayan
//completado todas las tareas
executor.shutdown();
}
public class NumerosAleatorios implements Runnable {
public void run() {
String strReturn = "";
Random random = new Random();
for (int i = 0; i <10; i++) {
strReturn += random.nextInt(50) + ", ";
Thread.yield();
}
System.out.println("Números aleatorio obtenidos por "
+ Thread.currentThread().getName() + ": " + strReturn);
}
}
// Se creará un pool de 2 hilos capaz de realizar 30 de esas tareas.
//output Números aleatorio obtenidos por pool-1-thread-2: 29, 13, 41, 37, 24, 3, 37, 48, 4, 12,