domingo, 27 de abril de 2014

Examen parcial Concurrencia Java 2012

Buenas gente, aquí os traigo el examen parcial de Programación de Sistemas y Concurrencia del 2012 resuelto (la parte de Java). El enunciado dice tal que así:

Desarrollar un programa en Java que permita calcular de manera concurrente el máximo de un array de elementos de tipo int. Para calcular el máximo suponer que se dispone de un array de N posiciones y M hebras donde N y M podrán ser leídos desde teclado o almacenados como constantes. Los valores contenidos en el array son inicializados aleatoriamente antes de la creación de las hebras.
La solución desarrollada dividirá el array N en M fragmentos de manera que cada una de las hebras calculará el máximo del fragmento de array que le corresponda (se puede suponer para simplificar que N es múltiplo de M). Posteriormente, una vez hayan terminado todas las hebras de calcular su máximo local, en la hebra principal del programa se procederá a calcular el máximo global examinando el máximo local de cada una de las hebras.
La siguiente figura ilustra el proceso para un array de 9 posiciones y 3 hebras.

Y aquí teneis el resultado:

import java.util.*;
public class Nodo extends Thread{
 
 private int[] vector;
 private int inic,fin;
 private int valor;
 private boolean[] res;
 
 public Nodo(int[] vector,int inic,int fin,int valor,boolean[] res){
  // busca "valor" en vector[inic..fin-1] y deja el resultado en res[0]
  this.vector = vector;
  this.valor = valor;
  this.res = res;
  this.inic = inic;
  this.fin = fin;
 }
 
 public void run(){
  
  if (inic == fin){
   res[0] = false;
  } else if (inic+1==fin){
   res[0] = (vector[inic]== valor);
  }else{
   boolean[] res1 = new boolean[1];
   boolean[] res2 = new boolean[1];
   Nodo izdo = new Nodo(vector,inic,(inic+fin)/2,valor,res1);
   Nodo dcho = new Nodo(vector,(inic+fin)/2,fin,valor,res2);
   izdo.start();
   dcho.start();
   try{
    izdo.join();
    dcho.join();
   } catch(InterruptedException ie){}
   
   res[0] = res1[0]||res2[0];
  }
  //System.out.println("Buscamos "+ valor +" en "+Arrays.toString(Arrays.copyOfRange(vector,inic,fin)) + "  "+res[0]);
 }
 
 public static void main(String[] args){
  Random r = new Random();
  int[] vector = new int[r.nextInt(20)+1];
  for (int i = 0; i<vector.length; i++){
   vector[i] = r.nextInt(20);
  }
  int valor = r.nextInt(20);
  System.out.println("Buscamos "+ valor +" en "+Arrays.toString(vector));
  boolean[] res = new boolean[1];
  Nodo nodo = new Nodo(vector,0,vector.length,valor,res);
  nodo.start();
  try{
   nodo.join();
  }catch(InterruptedException ie){}
  System.out.println("Esta el elemento: "+res[0]);
 }

}

Bueno, ya veis que era bastante sencillo. Espero que no hayais tenido mucha dificultad. Saludos y hasta otra ;)

No hay comentarios:

Publicar un comentario