elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  ¿Está mal este programa? Concurrencia y semáforos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Está mal este programa? Concurrencia y semáforos  (Leído 1,672 veces)
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
¿Está mal este programa? Concurrencia y semáforos
« en: 26 Septiembre 2014, 19:40 pm »

Buenas,

estoy con programación concurrente, y la verdad es que me cuesta bastante. En este caso, el ejercicio propuesto es un programa cuya salida sea:
A
BB
CCC
A
BB
CCC
etc.

Donde cada hilo imprime su letra. Esto es lo que he hecho, cuya salida es correcta:

Código
  1. public class HiloLetra implements Runnable{
  2.  
  3. char letra;
  4. int numVeces;
  5. Buffer buffer; //Recurso compartido
  6. static int turno;
  7.  
  8.  
  9. public HiloLetra(char letra, int numVeces, Buffer buffer) {
  10. this.letra = letra;
  11. this.numVeces = numVeces;
  12. this.buffer = buffer;
  13. }
  14.  
  15.  
  16. @Override
  17. public void run() {
  18. while(true) {
  19. try {
  20. buffer.imprimirLetra(letra, numVeces);
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  26. }
  27.  

Código
  1. import java.util.concurrent.Semaphore;
  2.  
  3.  
  4. public class Buffer {
  5.  
  6. int numeroLetras;
  7. Semaphore arrayCandados[];
  8. int posicionArray;
  9.  
  10.  
  11. public Buffer(int numeroLetras) {
  12. this.numeroLetras = numeroLetras;
  13. arrayCandados = new Semaphore[this.numeroLetras];
  14. posicionArray = 0;
  15. crearCandados();
  16. }
  17.  
  18. private void crearCandados() {
  19. arrayCandados[0] = new Semaphore(1);
  20. for(int i = 1; i < numeroLetras; i++) {
  21. arrayCandados[i] = new Semaphore(0);
  22. }
  23. }
  24.  
  25. public void imprimirLetra(char letra, int numeroLetra) throws InterruptedException {
  26.  
  27. while(numeroLetra-1 == posicionArray) {
  28. arrayCandados[posicionArray].acquire(numeroLetra);
  29.  
  30. for(int i = 0; i < numeroLetra; i++) {
  31. System.out.print(letra/*+", posicion array: "+posicionArray*/);
  32. }
  33. System.out.println();
  34.  
  35. posicionArray++;
  36. if(posicionArray == numeroLetras) {
  37. posicionArray = 0;
  38. }
  39.  
  40. arrayCandados[posicionArray].release(posicionArray+1);
  41. }
  42. }
  43. }
  44.  

Código
  1. public class Principal {
  2.  
  3. final int NUMERO_LETRAS = 3;
  4.  
  5.  
  6. HiloLetra runnables[];
  7. Thread hilosLetras[];
  8. Buffer buffer;
  9.  
  10.  
  11. public Principal() {
  12. runnables = new HiloLetra[NUMERO_LETRAS];
  13. hilosLetras = new Thread[NUMERO_LETRAS];
  14. buffer = new Buffer(NUMERO_LETRAS);
  15. crearHilos();
  16. }
  17.  
  18. private void crearHilos() {
  19. for(int i = 0; i < NUMERO_LETRAS; i++) {
  20. runnables[i] = new HiloLetra((char)(i+'A'), i+1, buffer);
  21. //System.out.println("creado hilo "+(char)(i+'A')+", num veces: "+(i+1));
  22. hilosLetras[i] = new Thread(runnables[i]);
  23. }
  24. }
  25.  
  26. private void iniciarHilos() {
  27. for(int i = 0; i < NUMERO_LETRAS; i++) {
  28. hilosLetras[i].start();
  29. }
  30. }
  31.  
  32.  
  33. public static void main(String[] args) {
  34. Principal principal = new Principal();
  35. principal.iniciarHilos();
  36. }
  37.  
  38.  
  39.  
  40. }

Buffer es la clase donde se guarda el array de semáforos, y cuya instancia es un recurso compartido por todos los hilos.

Como he dicho, la salida del programa es correcta. Pero mi duda radica en si la concurrencia de veras está bien gestionada. Porque, mientras se ejecuta el programa, el administrador de tareas indica que la CPU está al 100%, lo cual me hace pensar que no se estén gestionando bien los hilos.

Gracias de antemano y saludos.


En línea

NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: ¿Está mal este programa? Concurrencia y semáforos
« Respuesta #1 en: 4 Octubre 2014, 20:07 pm »

¿Nadie?


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines