Está en la página 1de 6

Este es un ejemplo que implementa un vector dinmico sincronizado programado en java (sin usar las clases que ya existen

ya que se trata de un ejercicio )

Para probar su funcionamiento lanzaremos varios threads que intentarn aadir y borrar elementos al vector de forma simultanea. Main.java [java] /* * Crear una implementacin sincronizada de un vector dinmico * * Mtodos: * aadir(elemento) * aadirEn(elemento, posicion) * borrar(elemento) * borrar(posicion) */ package ejerciciovectordinamico; /** * * @author: $Author: franchux $ * @version: $Rev: 100 $ * @date: $Date: 2009-04-21 09:38:58 +0200 (mar 21 de abr de 2009) $ * $Id: Main.java 100 2009-04-21 07:38:58Z franchux $ */ public class Main { public static final int HILOS = 8; /** * @param args the command line arguments */ public static void main(String[] args) { VectorDinamicoSincronizado vector = new VectorDinamicoSincronizado();

// Este array nos permitir controlar los hilos que creemos //Thread[] manejador = new Thread[HILOS]; // Creamos los hilos que intentarn modificar posiciones del vector con valores aleatorios for (int i = 0; i < HILOS; i++) { TestVectorDinamicoRunnable r = new TestVectorDinamicoRunnable(vector); Thread t = new Thread(r); t.start(); //manejador[i] = new Thread(r); //manejador[i].start(); } // Ahora llenamos el vector para que los hilos que puedan los sobreescriban for (int i = 0; i < HILOS; i++) { vector.aadir("-"); } // Damos un tiempo para que los hilos intenten hacer su trabajo espera(5000); // Cerramos los hilos que quedan abiertos int numActivas = Thread.activeCount(); Thread[] manejador = new Thread[numActivas]; Thread.enumerate(manejador); for (Thread t : manejador) { if (t.isAlive()) { t.interrupt(); } } System.out.println(vector); System.out.println("Hilo principal terminado"); } public static void espera(int milisegundos) { long t0, t1; t0 = System.currentTimeMillis(); do {

t1 = System.currentTimeMillis(); } while (t1 t0 < milisegundos); } } [/java] VectorDinamicoSincronizado.java [java] package ejerciciovectordinamico; /** * * @author: $Author: franchux $ * @version: $Rev: 100 $ * @date: $Date: 2009-04-21 09:38:58 +0200 (mar 21 de abr de 2009) $ * $Id: VectorDinamicoSincronizado.java 100 2009-04-21 07:38:58Z franchux $ */ public class VectorDinamicoSincronizado { protected String[] datos; final static int TIMEOUT = 1000; public VectorDinamicoSincronizado() { datos = new String[0]; } /** * Aade un nmero al final de la lista * * @param numero a insertar */ public void aadir(String texto) { //insertarOrdenado(numero); String[] nuevo = new String[datos.length + 1]; for (int i = 0; i < datos.length; i++) { nuevo[i] = datos[i]; } nuevo[datos.length] = texto; datos = nuevo;

loguea("pongo " + texto + " al final"); } /** * Aade una cadena en una determinada posicion * * @param texto a aadir * @param posicion posicin donde colocarlo */ public synchronized void aadirEn(String texto, int posicion) { try { // Si la posicin que intentamos insertar est fuera del vector actual // Esperamos a ver si hay suerte y el vector crece while(posicion > (datos.length 1)) { loguea("no puedo insertar " + texto + " en posicion " + posicion + " espero"); wait(TIMEOUT); } datos[posicion] = texto; loguea("pongo " + texto + " en " + posicion); } catch (InterruptedException ex) { // Logger.getLogger(VectorDinamicoSincronizado.class.getName()).log(Level.SEVERE, null, ex); loguea("HILO TERMINADO: no puedo insertar " + texto + " en posicion " + posicion + " abandono"); } notifyAll(); } public synchronized void borrar(int posicion) { String [] nueva = new String[datos.length -1]; int n=0; for(int i=0;i<datos.length;i++) { if(i!=posicion) { nueva[n++] = datos[i]; } } datos = nueva; }

/** * Muestra por pantalla un mensaje de debug * * @param texto a mostrar */ public void loguea(String texto) { System.out.println(Thread.currentThread().toString() + texto); } /** * Maqueta el contenido * * @return cadena con todos los numeros del array */ @Override public String toString() { String cad = "[ "; for (String d : datos) { cad += "" + d + " "; } cad += "]"; return cad; } } [/java] TestVectorDinamicoSincronizadoRunnable.java [java] package ejerciciovectordinamico; /** * * @author: $Author: franchux $ * @version: $Rev: 99 $ * @date: $Date: 2009-04-21 00:49:25 +0200 (mar 21 de abr de 2009) $ * $Id: TestVectorDinamicoRunnable.java 99 2009-04-20 22:49:25Z franchux $ */ public class TestVectorDinamicoRunnable implements Runnable {

VectorDinamicoSincronizado vector; public TestVectorDinamicoRunnable(VectorDinamicoSincronizado vector) { this.vector = vector; } public void run() { int num = (int) (Math.random() * 10); int pos; do { pos = (int) (Math.random() * 10) 1; } while(pos < 0); vector.aadirEn(""+num, pos); // vector.borrar((int)Math.random()); System.out.println(Thread.currentThread() + ": " + vector.toString()); } } [/java]

También podría gustarte